题目大意:转换个意思,大概是这样的。m个样例。给定元音辅音的价值。每个样例输入n,输出长度为n的最小价值的组成字符串。其中奇数位为元音,一个元音最多用21次,偶数位为辅音,一个辅音最多用5次。奇偶位可以用的字母,分别讨论,都是从小价值到高价值。相同价值,从上往下。
解题思路:打表,将元音按价值排序到105长度的字符串。辅音按优先级为(价值 > 上下顺序)排序到105长度的字符串。定义两个字符串分别读奇偶的字符,每读入一奇偶字符,就可以表示出两个结果的字符串。对两个字符串排序,按奇偶读给结果字符串。
ps:之前打表一直出错,原因在于,将未能参与结果字符串的字符进行排序,导致了结果出现错误。
ac代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
char a[6] = {"AUEOI"};
char b[22] = {"JSBKTCLDMVNWFXGPYHQZR"};
char s[2][107];
int main()
{
char ll[107], kk[107], res[212][212], temp1[107], temp2[107];
int n, m, count=1, temp;
for (int i=0; i<105; i++){
ll[i] = a[i/21];
kk[i] = b[i/5];
s[0][i] = ll[i];
sort(s[0], s[0]+1+i);
for (int j=0,k1=0,k2=0; j<=2*i; j++){
sort(s[1], s[1]+i);
if (j%2==0)
res[2*i][j] = s[0][k1++];
else res[2*i][j] = s[1][k2++];
res[2*i][j+1] = '\0';
}
s[1][i] = kk[i];
sort(s[1], s[1]+i+1);
for (int j=0,k1=0,k2=0; j<=2*i+1; j++){
if (j%2==0)
res[2*i+1][j] = s[0][k1++];
else res[2*i+1][j] = s[1][k2++];
res[2*i+1][j+1] = '\0';
}
}
cin >> n;
while (n--){
cin >> m;
printf("Case %d: %s\n", count, res[m-1]);
count++;
}
return 0;
}