[ 9.26 ]CF每日一題系列—— 771B遞推問題
阿新 • • 發佈:2018-09-27
std ret 重名 () while 字數 har rip ace
Description:
給定你命名的規律,1-10個字符,開頭必須大寫,最多有50個名字,然後告訴你有n個人,判斷區間長度為k,那麽你將得到n - k + 1個答案(YES or NO) 表示1 - k,2 -k+1,n - K + 1-— n這些人裏面是否沒有重名,YES沒有,NO有,讓你推出一種名字的組合方式
Solution:
首先先跑出一個名字數組,這個題目要往後看,所以應該是從後往前推n - k + 2 到 n的名字沒有要求,所以我們命名各不相同,從n - k + 1開始,如果是YES必須給他一個新的名字,如果是NO,那麽給他一個重復的名字,為了不影響後面的答案,所以我們給他i + k -1個名字,也就是這個區間段的最後一個人的名字啦
Code:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string> using namespace std; string name[55]; int main() { for(int i = 0;i < 52;++i) { if(i < 26)name[i] = ‘A‘ + i; else name[i] = name[i - 26] + ‘a‘; } int n,k; int nameid = 0; string outname[55]; string op[55]; while(~scanf("%d%d",&n,&k)) { for(int i = 0;i < n - k + 1;++i) { cin>>op[i]; } for(int i = n - 1;i >= 0;--i) { if(n - i < k)outname[i] = name[nameid++]; else { if(op[i][0] == ‘Y‘) { outname[i] = name[nameid++]; } else { outname[i] = outname[i+k-1]; } } } for(int i = 0;i < n-1;++i) { cout<<outname[i]<<" "; } cout<<outname[n-1]<<endl; } return 0; }
[ 9.26 ]CF每日一題系列—— 771B遞推問題