链接:https://www.nowcoder.com/acm/contest/70/C
来源:牛客网
题目描述
定义一个数字为幸运数字当且仅当它的所有数位都是4或者7。
比如说,47、744、4都是幸运数字而5、17、467都不是。
假设现在有一个数字d,现在想在d上重复k次操作。
假设d有n位,用d1,d2,...,dn表示。
对于每次操作,我们想要找到最小的x (x < n),使得dx=4并且dx+1=7。
如果x为奇数,那么我们把dx和dx+1都变成4;
否则,如果x为偶数,我们把dx和dx+1都变成7;
如果不存在x,那么我们不做任何修改。
现在请问k次操作以后,d会变成什么样子。
比如说,47、744、4都是幸运数字而5、17、467都不是。
假设现在有一个数字d,现在想在d上重复k次操作。
假设d有n位,用d1,d2,...,dn表示。
对于每次操作,我们想要找到最小的x (x < n),使得dx=4并且dx+1=7。
如果x为奇数,那么我们把dx和dx+1都变成4;
否则,如果x为偶数,我们把dx和dx+1都变成7;
如果不存在x,那么我们不做任何修改。
现在请问k次操作以后,d会变成什么样子。
输入描述:
第一行两个整数n,k表示d的长度和操作次数。
第二行一个数表示d。数据保证不存在前导零。
1 <= n <= 100,000
0 <= k <= 1000,000,000
输出描述:
一个数字表示答案。
示例1
输入
7 4 4727447
输出
4427477
示例2
输入
4 2 4478
输出
4478
分析:找规律,发现“......447...”的时候,如果7前面的4的序号是偶数(这里序号从1开始),
就变为“......477......”,下次找到4的时候,4的序号是奇数,就变成“......447...”,
这是一个循环,这样就好办多了。。。
#include<cstdio> char s[200000]; int main() { int n,k; scanf("%d%d",&n,&k); scanf("%s",s); int i,flag; while(k--) { i=0,flag=0; while(i<n) { if(s[i]=='4'&&s[i+1]=='7') {flag=1;break;} i++; } if(flag==0) break; if(s[i+2]=='7'&&i%2==0)//两个7 ,477->447 { if(k%2==0) s[i+1]='4'; break; } if(i-1>=0&&s[i-1]=='4'&&i%2==1) { if(k%2==0) s[i]='7'; break; } if(i%2==0) s[i+1]='4'; else s[i]='7'; } printf("%s ",s); return 0; }