We Got Everything Covered! - Codeforces Round 921 (Div. 2) A
中文题面
给你两个正整数 \(n\) 和 \(k\)。
您的任务是找出一个字符串 \(s\) ,使得所有可能的长度为 \(n\) 的字符串都可以用前 \(k\) 个小写英文字母作为 \(s\) 的子序列出现。
如果有多个答案,则打印长度最小的答案。如果仍有多个答案,可以打印其中任意一个。
注: 如果从 \(b\) 中删除一些字符(可能为零)而不改变其余字符的顺序即可得到 \(a\) ,则字符串 \(a\) 称为另一个字符串 \(b\) 的子串。
输入
第一行输入包含一个整数 \(t\) ( \(1\leq t\leq 676\) ),表示测试用例的数量。
每个测试用例包含一行输入,其中包含两个整数 \(n\) ( \(1\leq n\leq 26\) ) 和 \(k\) ( \(1\leq k\leq 26\) )。
输出
对于每个测试用例,打印一行包含满足上述属性的字符串 \(s\) 。如果有多个答案,打印长度最小的一个。如果仍有多个答案,则打印其中任意一个。
样例
4
1 2
2 1
2 2
2 3
ab
aa
baab
abcbac
注
对于第一个测试用例,有两个长度为 \(1\) 的字符串,可以用前 \(2\) 个小写英文字母组成,它们作为子序列出现在 \(s\) 中,如下所示:
对于第二个测试用例,只有一个长度为 \(2\) 的字符串可以用第一个小写英文字母组成,它作为子序列出现在 \(s\) 中,如下所示:
对于第三个测试用例,有长度为 \(2\) 的 \(4\) 个字符串可以用第一个 \(2\) 小写英文字母组成,它们作为子序列出现在 \(s\) 中,如下所示:
对于第四个测试用例,有长度为 \(2\) 的 \(9\) 个字符串可以用第一个 \(3\) 个小写英文字母组成,它们作为子序列出现在 \(s\) 中,如下所示:
题目思路
这道题目是一道贪心题,由于这道题的答案不唯一,所以等同于开启了 \(SPJ\)!
那么,这道题的解法就有很多种,比如样例就可以是这样的:
4
1 2
2 1
2 2
2 3
ab
aa
baab
cbaabc
根据上方样例,我们发现,对于这道题目,我们只需要顺倒交替输出前 \(k\) 个字母共 \(n\) 次即可!
AC Code:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
int n,k;
scanf("%d%d",&n,&k);
for(int j=1;j<=n;j++)
{
for(int x=0;x<k;x++)
{
if(j%2==0)printf("%c",(char)(x+'a'));
else printf("%c",(char)(k-x-1+'a'));
}
}
printf("\n");
}
return 0;
}

浙公网安备 33010602011771号