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

时间:2022-01-20 12:20:03

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