幸运序列(lucky)

【问题描述】

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

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

Lsy现在手上有一个长度为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],继续第一步。

Lsy想让你告诉他最后序列折腾成什么样子了。

需要注意的是,本题的序列从1开始编号

【输入文件】

第一行N,K;

第二行N个数描述序列a。

【输出文件】

   N个数,输出最后的序列。

【输入样例】

7 4

4727447

 

【输出样例】

4427477

 

【数据规模和约定】

20%:  小数据

100%的数据中N<=100000,K<=109

因为后面的不会对前面产生影响 所以顺序处理就行了

如果pos为偶数,那么a[i]=a[i+1]下一次就得从pos-1开始

反之从pos开始

对于过大的p我们可以发现:

1.当pos=n-1时,无论怎样都不能,直接退出

2.当出现循环时,将k取膜

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,k,pos,x,vis[100001];
 7 char s[1000001];
 8 int main()
 9 {
10     //freopen("lucky.in","r",stdin);
11     //freopen("lucky.out","w",stdout);
12     cin>>n>>k;
13      cin>>s;
14      pos=0;x=1;
15      while (k--)
16      {
17         while (pos<n-1&&!(s[pos]=='4'&&s[pos+1]=='7')) 
18           pos++; 
19        if (pos==n-1) break;
20        if (vis[pos]==0) vis[pos]=x;
21        else 
22        {
23          k%=(x-vis[pos]);
24        }
25         if (pos%2==0) s[pos+1]=s[pos];
26         else 
27         {
28           s[pos]=s[pos+1];
29           pos=pos-1;
30         }
31         x++;
32      }
33     cout<<s;
34 }

 

posted @ 2017-08-23 14:49  Z-Y-Y-S  阅读(952)  评论(0编辑  收藏  举报