1. 程式人生 > >[ 9.26 ]CF每日一題系列—— 771B遞推問題

[ 9.26 ]CF每日一題系列—— 771B遞推問題

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遞推問題