AcWing 3807. 构造字符串
题目描述
给定两个整数 和 ,请你构造一个长度为 的字符串 。
字符串 需满足:
-
由前 个小写字母构成,且前 个小写字母均在 中出现至少一次。
-
前 个小写字母中,出现次数最少的字母的出现的次数尽可能多。
输出任意满足条件的字符串 。
输入格式
第一行包含整数 ,表示共有 组测试数据。
每组数据占一行,包含两个整数 和 。
输出格式
每组数据输出一个结果,表示满足条件的字符串 。
如果答案不唯一,输出任意合理方案均可。
数据范围
样例
输入样例:
3
7 3
4 4
6 2
输出样例:
cbcacab
abcd
baabab
思路
题目要求出现次数最小的字母,出现次数尽可能多,只要尽可能平均的分配字母即可。
题目至少需要 个不同的字母。那么每个字母都可以出现 次。
然后将剩下的 % 个位置,用前 个字母中,不同的字母填入即可。
代码
C++
#include <iostream>
using namespace std;
int main()
{
int T;
cin >> T;
while ( T-- )
{
int n, k;
cin >> n >> k;
string res;
for ( int i = 0; i < n / k; i++ )
for ( int j = 0; j < k; j++ )
res += 'a' + j;
for ( int i = 0; i < n % k; i++ )
res += 'a' + i;
cout << res << endl;
}
return 0;
}
Java
import java.util.*;
public class Main
{
static Scanner in = new Scanner(System.in);
public static void main(String args[])
{
int T = in.nextInt();
while ( T-- > 0 )
{
int n = in.nextInt(), k = in.nextInt();
StringBuilder res = new StringBuilder();
for ( int i = 0; i < n / k; i ++ )
for ( int j = 0; j < k; j ++ )
res.append((char) ('a' + j));
for ( int i = 0; i < n % k; i ++ )
res.append((char) ('a' + i));
System.out.printf("%s\n", res.toString());
}
}
}
