【问题描述】
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开始编号
【输入文件】
第一行N,K;
第二行N个数描述序列a。
【输出文件】
N个数,输出最后的序列。
【输入样例】
7 4 4727447 |
【输出样例】
4427477 |
【数据规模和约定】
20%: 小数据
100%的数据中N<=100000,K<=109。
刚开始看到这题,我tm直接暴力模拟一遍,结果忘记了判断循环的情况,结果直接爆零了。
实际上我们判断一下循环的情况就好了。
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define ll long long #define il inline #define db double using namespace std; il int gi() { int x=0,y=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘) y=-1; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘) { x=x*10+ch-‘0‘; ch=getchar(); } return x*y; } il ll gl() { ll x=0,y=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘) y=-1; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘) { x=x*10+ch-‘0‘; ch=getchar(); } return x*y; } int n,k,begin=1; int que[100045]; bool vis[100045]; il bool find() { for(int i=begin;i<n;i++) if(que[i]==4&&que[i+1]==7) { if(i%2) { que[i+1]=4; begin=i+1; } else { que[i]=7; begin=i-1; } if(vis[i]&&k%2==0) return 0; vis[i]=1; return 1; } return 0; } int main() { freopen("lucky.in","r",stdin); freopen("lucky.out","w",stdout); n=gi(),k=gi(); for(int i=1;i<=n;i++) que[i]=getchar()-‘0‘; while(k--) { if(!find()) break; } for(int i=1;i<=n;i++) printf("%d",que[i]); return 0; }
时间: 2024-12-06 13:17:24