We Got Everything Covered!(我们保罗万象)
时间限制:1.0s 内存限制:256MB
【原题地址】
【问题描述】
给你两个正整数 n 和 k 。
您的任务是找出一个字符串 s ,使得所有可能的长度为 n 的字符串都可以用前 k 个小写英文字母作为 s 的子序列出现。
如果有多个答案,则打印长度最小的答案。如果仍有多个答案,可以打印其中任意一个。
注: 如果从 b 中删除一些字符(可能为零)而不改变其余字符的顺序即可得到 a ,则字符串 a 被称为另一个字符串 b 的子串。
【输入格式】
第一行输入包含一个整数 t ( 1≤t≤676 ),表示测试用例的数量。
每个测试用例包含一行输入,其中包含两个整数 n ( 1≤n≤26 ) 和 k ( 1≤k≤26 )。
【输出格式】
对于每个测试用例,打印一行包含满足上述属性的字符串 s 。如果有多个答案,打印长度最小的一个。如果仍有多个答案,则打印其中任意一个。
【样例输入】
4
1 2
2 1
2 2
2 3
【样例输出】
ab
aa
baab
abcbac
【样例说明】
对于第一个测试用例,有两个长度为 1 的字符串,可以用前 2 个小写英文字母组成,它们作为子序列出现在 s 中,如下所示:
a:ab
b:ab
对于第二个测试用例,只有一个长度为 2 的字符串可以用第一个小写英文字母组成,它作为子序列出现在 s 中,如下所示:
aa:aa
对于第三个测试用例,有长度为 2 的 4 个字符串可以用第一个 2 小写英文字母组成,它们作为子序列出现在 s 中,如下所示:
aa:baab
ab:baab
ba:baab
bb:baab
对于第四个测试用例,有长度为 2 的 9 个字符串可以用第一个 3 个小写英文字母组成,它们作为子序列出现在 s 中,如下所示:
aa:abcbac
ab:abcbac
ac:abcbac
ba:abcbac
bb:abcbac
bc:abcbac
ca:abcbac
cb:abcbac
cc:abcbac
【解题思路】
老汉使用到的是贪心的解题方式
本题是求以用所有前 k 个小写英文字母组成长度为 n 的字符串为子序列最短的字符串 s ,通过对子序列的组成分析,得出子序列的每一个字符都来自于序列 [‘a’,‘a’+k) 之中,子序列有几个字符就取几组序列 [‘a’,‘a’+k) ,合并起这几组序列即为最终答案之一 s(本题有多个答案,写出一个就行)。
代码注释有详细过程
【代码】
package CF1925_A_WeGotEverythingCovered;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 接收题目数据t
int t = scan.nextInt();
// 一共t组数据,分别计算输出结果
while (t-- > 0) {
// 接收数据n
int n = scan.nextInt();
// 接收数据k
int k = scan.nextInt();
// 利用字符串缓冲区对字符串进行操作
StringBuffer str = new StringBuffer();
// 分析得出子序列的每一个字符都来自于序列['a','a'+k)之中,子序列有几个字符就取几组序列['a','a'+k)
for (int i = 0; i < n; i++) {
for (char cr = 'a'; cr < 'a' + k; cr++) {
// 将字符cr插入str序列中
str.append(cr);
}
}
// 输出答案
System.out.println(str);
}
scan.close();
}
}