1. 程式人生 > >[測試題]幸運序列(lucky)

[測試題]幸運序列(lucky)

stack 100% else sca 最小 幸運 測試題 cnblogs 找到

Description

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開始編號

Input

第一行N,K;

第二行N個數描述序列a。

Output

N個數,輸出最後的序列。

Sample Input

7 4

4727447

Sample Output

4427477

Hint

20%: 小數據

100%的數據中N<=100000,K<=109

題解

找規律,模擬

可以發現只有開始位置為奇數的$447$或$477$存在循環現象,而只要沒有出現循環,修改操作的總次數不會超過$N$。

接下來就只要按照題意模擬即可。

 1 #include<set>
 2 #include<map>
 3
#include<cmath> 4 #include<ctime> 5 #include<queue> 6 #include<stack> 7 #include<vector> 8 #include<cstdio> 9 #include<string> 10 #include<cstring> 11 #include<cstdlib> 12 #include<iostream> 13 #include<algorithm> 14 #define
LL long long 15 using namespace std; 16 const int N=100000; 17 18 int n,k; 19 char ch[N+5]; 20 bool vis[N+5]; 21 22 int main() 23 { 24 scanf("%d%d",&n,&k); 25 scanf("%s",ch+1); 26 for (int i=1;i<n;i++) if (ch[i]==4&&ch[i+1]==7) 27 { 28 if (vis[i]&&!(k%2)) {vis[i]=1;break;} 29 vis[i]=1; 30 if (i%2) ch[i+1]=ch[i]; 31 else ch[i]=ch[i+1],i-=2; 32 k--; 33 if (!k) break; 34 } 35 printf("%s",ch+1); 36 return 0; 37 }

[測試題]幸運序列(lucky)