[ 9.26 ]CF每日一题系列—— 771B递推问题

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;
}

猜你喜欢

转载自www.cnblogs.com/DF-yimeng/p/9710792.html