2018.08.27 lucky(模拟)

版权声明:随意转载哦......但还是请注明出处吧: https://blog.csdn.net/dreaming__ldx/article/details/82120076

描述

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;
}

猜你喜欢

转载自blog.csdn.net/dreaming__ldx/article/details/82120076