题目的意思是,给你一个数target和一串字符串,字符串全部都为大写字母。A = 1,B = 2 .......Z = 26.
要求从那个字符串中的字母找出一个组合vxyz,使得v - w^2 + x^3 - y^4 + z^5 = target
题目还要求这个组合的字典数最大。
字符串最大长度为12,所以可以很简单的用暴力通过。而要使得字典数最大,则将字符串排序一下,找的最后一个组合就是最大字典数。
下面的是AC的代码:
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { // freopen("data.txt", "r", stdin); int num, flag, i, j, k, l, m; int tag[15]; char str[15], ans[8]; while(cin >> num >> str && num) { int length = strlen(str); flag = 1; memset(tag, 0, sizeof(tag)); for(i = 0; i < length; i++) { tag[i] = str[i] - 'A' + 1; } sort(tag, tag + length); //排序 for(i = 0; i < length; i++) //枚举 for(j = 0; j < length; j++) <span style="white-space:pre"> </span>if(j != i) <span style="white-space:pre"> </span>for(k = 0; k < length; k++) <span style="white-space:pre"> </span>if(k != j && k != i) <span style="white-space:pre"> </span>for(l = 0; l < length; l++) if(l != k && l != j && l != i) for(m = 0; m < length; m++) { if(m != l && m != k && m != j && m != i && tag[i] - tag[j] * tag[j] + tag[k] * tag[k] * tag[k] - tag[l] * tag[l] * tag[l] * tag[l] + tag[m] * tag[m] * tag[m] * tag[m] * tag[m] == num) { flag = 0; ans[0] = tag[i] - 1 + 'A'; ans[1] = tag[j] - 1 + 'A'; ans[2] = tag[k] - 1 + 'A'; ans[3] = tag[l] - 1 + 'A'; ans[4] = tag[m] - 1 + 'A'; ans[5] = '\0'; } } if(flag) cout << "no solution" << endl; else cout << ans << endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/qq_25425023/article/details/46926117