描述
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
提示
100%的数据中 N<=100000, K<=1E9。
康复训练ing。。。
貌似就是一道模拟题,发现只要出现“447”或者“477”(中间的数字是偶数位)就会死循环,这样判断一下就没了。
模拟大法好!!!
代码:
#include<bits/stdc++.h>
#define N 100005
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,k,a[N];
char ss[N];
int main(){
n=read(),k=read();
scanf("%s",ss+1);
for(int i=1;i<=n;++i)a[i]=ss[i]-'0';
for(int i=1;i<=n;++i){
if(!k)break;
if(a[i]==4&&a[i+1]==7){
--k;
if(i&1)a[i+1]=4;
else{
a[i]=7;
if(a[i-1]==4){a[i]=(k&1)?4:7;break;}
}
}
}
for(int i=1;i<=n;++i)cout<<a[i];
return 0;
}