幸运序列(lucky) 模拟

【问题描述】

Ly喜欢幸运数字,众所周知,幸运数字就是数字位上只有4和7的数字。

但是本题的幸运序列和幸运数字完全没关系,就是一个非常非常普通的序列。哈哈,是不是感觉被耍了,没错,你就是被耍了。

Ly现在手上有一个长度为N的幸运序列a,他想这样子折腾这个序列:

  1. 如果已经折腾了k次了,就结束,否则找到一个最小的i,使得(a[i]=’4’ && a[i+1]=’7’)  //0<i<N;
  2. 找不到这样的i就结束;
  3. 如果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;
}

 

posted @ 2017-08-23 18:39  GSHDYJZ  阅读(417)  评论(0编辑  收藏  举报