题目的意思是,给你一个数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++)
if(j != i)
for(k = 0; k < length; k++)
if(k != j && k != i)
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;
}