UVa 10785 The Mad

/* coder: ACboy date: 2010-2-28 result: 1AC description: UVa 10785 The Mad Numerologist (gready) */ #include <iostream> #include <algorithm> using namespace std; // 标记每个字母被使用的次数 // 元音字母最多不超过21次,辅音字母不超过5次 int vis[300]; // 元音字母表(按值从小到大排序) char vowel[] = "AUEOI"; // 辅音字母表(按值从大到小排序) char consonant[] = "JSBKTCLDMVNWFXGPYHQZR"; // 用于保存生成的字符串的元音字母 char one[300]; // 用于保存生成的字符串的辅音字母 char two[300]; int main() { int i, j; int n; #ifndef ONLINE_JUDGE freopen("10785.txt", "r", stdin); #endif cin >> n; int size = 1; while (n--) { int input; cin >> input; // a, b分别用于保存生成的字符串中的元音字母数和 // 辅音字母数 int a, b; if (input % 2 == 0) {a = input / 2; b = input / 2;} else {a = input / 2 + 1; b = input / 2;} memset(vis, 0, sizeof(vis)); // 贪心算法每次都取值最小的字母都取到满(元音21个,辅音5个) int c = 0; // k用于存储能够取满的字母的个数。 int k = a / 21; // d用于保存取不满的字母应取数。 int d = a % 21; int count = 0; for (i = 0; i < k; i++) { if (vis[vowel[c] - 'A'] >= 21) { c++; } for (j = 0; j < 21; j++) { one[count++] = vowel[c]; } vis[vowel[c] - 'A'] = 21; } if (k != 0) c++; for (i = 0; i < d; i++) { one[count++] = vowel[c]; vis[vowel[c] - 'A']++; } one[count] = '/0'; // 因为题目要求是字典顺序最小的,所有进行排序 sort(one, one + count); k = b / 5; d = b % 5; c = 0; count = 0; for (i = 0; i < k; i++) { if (vis[consonant[c] - 'A'] >= 5) c++; for (j = 0; j < 5; j++) { two[count++] = consonant[c]; } vis[consonant[c] - 'A'] = 5; } if (k != 0) c++; for (i = 0; i < d; i++) { two[count++] = consonant[c]; vis[consonant[c] - 'A']++; } two[count] = '/0'; sort(two, two + count); cout << "Case " << size++ << ": "; int apoint = 0; int bpoint = 0; // 交替输出元音字母和辅音字母从而得到结果。 for (i = 0; i < input; i++) { if (i % 2 == 0) cout << one[apoint++]; else cout << two[bpoint++]; } cout << endl; } return 0; }

上面为AC代码(贪心算法)

下面是我之前的代码,由于本题解答树很大,end的值大一点的话就要算很久,用回溯算法效率很低。

/* coder: ACboy date: 2010-2-28 */ #include <iostream> using namespace std; char consonantTable[] = "BCDFGHJKLMNPQRSTVWXYZ"; char vowelTable[] = "AEIOU"; int tableValue[] = {1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8}; int vis[30]; int vowelMinValue = 3000; int consonantMinValue = 3000; int end; void getValue(int * p, int * q, char temp[]) { int i; *p = 0; *q = 0; for (i = 0; i < strlen(temp); i ++) { if (i % 2 == 0) *q += tableValue[temp[i] - 'A']; else *p += tableValue[temp[i] - 'A']; } } void dfs(int pos, char temp[], char result[]) { int i, j; if (pos == end) { temp[pos] = '/0'; int vowelValue; int consonantValue; getValue(&consonantValue, &vowelValue, temp); if (consonantValue < consonantMinValue && vowelValue < vowelMinValue) { strcpy(result, temp); consonantMinValue = consonantValue; vowelValue = vowelMinValue; } else if (consonantValue == consonantMinValue && vowelValue == vowelMinValue) { if (strcmp(temp, result) < 0){ strcpy(result, temp); } } return; } else { if (pos % 2 == 0) { for (i = 0; i < 5; i++) { if (vis[vowelTable[i] - 'A'] < 21) { temp[pos] = vowelTable[i]; vis[vowelTable[i] - 'A']++; dfs(pos + 1, temp, result); vis[vowelTable[i] - 'A']--; } } } else { for (i = 0; i < 21; i++) { if (vis[consonantTable[i] - 'A'] < 21) { temp[pos] = consonantTable[i]; vis[consonantTable[i] - 'A']++; dfs(pos + 1, temp, result); vis[consonantTable[i] - 'A']--; } } } } } int main() { int a, b; int n; cin >> n; for (int i = 1; i <= n; i++) { vowelMinValue = 3000; consonantMinValue = 3000; char result[300]; char temp[300]; cin >> end; memset(vis, 0, sizeof(vis)); dfs(0, temp, result); cout << result << endl; } return 0; }

你可能感兴趣的:(UVa 10785 The Mad)