题目
给定一个整数n和一个由不同大写字母组成的字符串str(长度大于5,小于12),每一格字母在字母表中对应有一个序数(A=1,B=2,……,Z=26),从str中选择5个字母构成密码,例如选取的5个字母为v、w、x、y和z,他们要满足:
例如,给定的n=1,,字符串str为“ABCDEFGHIJKL”,一个可能的解释“FIECB”,因为
,但这样的解可以有多个,最终结果是按字典序最大的那个,所以这里的正确答案为“LKEBA”
输入描述
每一行为n和str,以输入n=0结束
输出描述
每一行输出相应的密码,当密码不存在时输出“no solution”
输入样例
1 ABCDEFGHIJKL
11700519 ZAYEXIWOVU
3072997 SOUGHT
1234567 THEQUICKFROG
0
输出样例
LKEBA
YOUXUZ
GHOST
no solution
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
char s[15];
bool vis[15], tag;
int t, len;
int Cal(int y, int w, int v, int x, int z)
{
v -= 64, w -= 64, x -= 64, y -= 64, z -= 64;
return (v - w*w + x*x*x - y*y*y*y + z*z*z*z*z);
}
int main()
{
while(scanf("%d %s", &t, s))
{
len = strlen(s);
if(t == 0 && !strcmp(s,"END")) break;
tag = true;
//将可选序列按升序排列
for(int i = 1; i < len && tag; i++)
{
for(int j = 0, tag = false; j < len - i; j++)
{
if(s[j] < s[j + 1])
{
swap(s[j], s[j + 1]);
tag = true;
}
}
}
for(int i = 0; i < len; i++) vis[i] = false;
//若target在值域之外,no solution
if(Cal(s[0], s[1], s[len - 3], s[len - 2], s[len - 1]) > t || Cal(s[len - 1], s[len - 2], s[2], s[1], s[0]) < t)
puts("no solution");
else
{
int a, b, c, d, e;
tag = false;
for(a = 0; a < len; a++)
{
vis[a] = true;
for(b = 0; b < len; b++)
{
if(!vis[b])
{
vis[b] = true;
for(c = 0; c < len; c++)
{
if(!vis[c])
{
vis[c] = true;
for(d = 0; d < len; d++)
{
if(!vis[d])
{
vis[d] = true;
for(e = 0; e < len; e++)
if(!vis[e] && Cal(s[d], s[b], s[a], s[c], s[e]) == t)
{
tag = true;
goto end;
}
vis[d] = false;
}
}
vis[c] = false;
}
}
vis[b] = false;
}
}
vis[a] = false;
}
end:
if(!tag)
puts("no solution");
else
printf("%c%c%c%c%c\n", s[a], s[b], s[c], s[d], s[e]);
}
}
return 0;
}
以下为我的微信公众号:技术经理的成长
会不定期进行更新,欢迎关注