您的位置:首页 > 其它

SSL2770 2017年10月17日提高组 神奇变化

2017-10-18 20:47 211 查看

2017年10月17日提高组 神奇变化

Description

给定一个有n个数字的序列,记作{an},需要进行k次操作,每次操作找到最小的x使得a(x)=2,a(x+1)=3,如果x为奇数,则令d(x+1)=2,反之令d(x)=3,若没有这样的x则数字不变。

求k此操作之后原数列会变成什么

Input

本题有多组数据。

每组数据第一行是两个正整数n,k分别表示数字个数和操作次数

第二行有n个数字,数字之间没有空格

Output

对每组数据输出一行为最终的数列

分析:据大佬说:很显然的题目,直接O(n)扫一遍就好。。。(tips:不难发现到223或233时会循环。)

代码

#include <cstdio>
#include <string>
#include <cstring>
#define maxn 2000000
using namespace std;

int n,k;
char a[maxn];

int main()
{
while(~scanf("%d%d",&n,&k))
{
int p=0;
scanf("%s",a+1);
int i=1;
while (i<=n&&k>0)
{
if (a[i]=='2'&&a[i+1]=='3')
{
int mo=i%2;
if (a[i+2]=='3'&&mo==1) break;
if (mo==0)
{
a[i]='3';
i--;
k--;
continue;
}
else
{
a[i+1]='2';
i++;
k--;
continue;
}
}
i++;
}
k%=2;
if (k==1) a[i+1]='2';
for (int i=1;i<=n;i++)
printf("%c",a[i]);
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: