幸運序列(lucky) 模擬
阿新 • • 發佈:2017-08-23
-- turn 忘記 cstring 喜歡 數據規模 div code idt
【問題描述】
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 |
【數據規模和約定】
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; }
幸運序列(lucky) 模擬