Description
Ly喜欢幸运数字,众所周知,幸运数字就是数字位上只有4和7的数字。
但是本题的幸运序列和幸运数字完全没关系,就是一个非常非常普通的序列。哈哈,是不是感觉被耍了,没错,你就是被耍了。
Ly现在手上有一个长度为N的幸运序列a,他想这样子折腾这个序列:
- 如果已经折腾了k次了,就结束,否则找到一个最小的i,使得(a[i]=’4’ && a[i+1]=’7’) //0<i<N;
- 找不到这样的i就结束;
- 如果odd(i),令a[i+1]=a[i],否则令a[i]=a[i+1],继续第一步。
Ly想让你告诉他最后序列折腾成什么样子了。
需要注意的是,本题的序列从1开始编号
Input
第一行N,K;
第二行N个数描述序列a。
Output
N个数,输出最后的序列。
Sample Input
7 4
4727447
Sample Output
4427477
Hint
20%: 小数据
100%的数据中N<=100000,K<=109。
题解
找规律,模拟
可以发现只有开始位置为奇数的$447$或$477$存在循环现象,而只要没有出现循环,修改操作的总次数不会超过$N$。
接下来就只要按照题意模拟即可。
1 #include<set> 2 #include<map> 3 #include<cmath> 4 #include<ctime> 5 #include<queue> 6 #include<stack> 7 #include<vector> 8 #include<cstdio> 9 #include<string> 10 #include<cstring> 11 #include<cstdlib> 12 #include<iostream> 13 #include<algorithm> 14 #define LL long long 15 using namespace std; 16 const int N=100000; 17 18 int n,k; 19 char ch[N+5]; 20 bool vis[N+5]; 21 22 int main() 23 { 24 scanf("%d%d",&n,&k); 25 scanf("%s",ch+1); 26 for (int i=1;i<n;i++) if (ch[i]==‘4‘&&ch[i+1]==‘7‘) 27 { 28 if (vis[i]&&!(k%2)) {vis[i]=1;break;} 29 vis[i]=1; 30 if (i%2) ch[i+1]=ch[i]; 31 else ch[i]=ch[i+1],i-=2; 32 k--; 33 if (!k) break; 34 } 35 printf("%s",ch+1); 36 return 0; 37 }
时间: 2024-10-11 00:07:03