幸运序列(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取膜

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,k,pos,x,vis[];
char s[];
int main()
{
//freopen("lucky.in","r",stdin);
//freopen("lucky.out","w",stdout);
cin>>n>>k;
cin>>s;
pos=;x=;
while (k--)
{
while (pos<n-&&!(s[pos]==''&&s[pos+]==''))
pos++;
if (pos==n-) break;
if (vis[pos]==) vis[pos]=x;
else
{
k%=(x-vis[pos]);
}
if (pos%==) s[pos+]=s[pos];
else
{
s[pos]=s[pos+];
pos=pos-;
}
x++;
}
cout<<s;
}
上一篇:AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置


下一篇:JQ中mouseover和mouseenter的区别