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

来源:互联网 发布:男士面霜 知乎 编辑:程序博客网 时间:2024/05/29 04:20

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 2000000using 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");    }}
原创粉丝点击