UVA 10785

来源:互联网 发布:51talk怎么样 知乎 编辑:程序博客网 时间:2024/06/05 23:56

题目大意:转换个意思,大概是这样的。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;}