hdu 1015 - Safecracker

来源:互联网 发布:电脑编程语言 编辑:程序博客网 时间:2024/06/08 07:59

题目:字母'A'~'Z'对应数值1~26,现在给你一个字母表和target,从里面选取5个字母v、w、x、y、z,

            使得公式v - w^2 + x^3 - y^4 + z^5 = target成立,找到字典序最大的vwxyz。

分析:简单题、搜索。因为一定选取5个元素,所以直接暴力即可(模拟递归)。

说明:计算时标记取过的字母,避免重复计算。

#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>using namespace std;char table[13];int  visit[13];int value(int v, int w, int x, int y, int z){v = table[v]-'A'+1; w = table[w]-'A'+1;x = table[x]-'A'+1; y = table[y]-'A'+1; z = table[z]-'A'+1;return v - w*w + x*x*x - y*y*y*y + z*z*z*z*z;}int main(){int target;while (~scanf("%d%s",&target,table) && target) {int flag = 0,len = strlen(table);sort(table, table+len);for (int v = len-1 ; v >= 0 ; -- v) {visit[v] = 1;for (int w = len-1 ; w >= 0 ; -- w) if (!visit[w]) {visit[w] = 1;for (int x = len-1 ; x >= 0 ; -- x) if (!visit[x]) {visit[x] = 1;for (int y = len-1 ; y >= 0 ; -- y) if (!visit[y]) {visit[y] = 1;for (int z = len-1 ; z >= 0 ; -- z) if (!visit[z]) {if (value(v, w, x, y, z) == target) {printf("%c%c%c",table[v],table[w],table[x]);printf("%c%c\n",table[y],table[z]);flag = 1;break;}}visit[y] = 0; if (flag) break;}visit[x] = 0; if (flag) break;}visit[w] = 0; if (flag) break;}visit[v] = 0; if (flag) break;}if (!flag) printf("no solution\n");}    return 0;}


0 0
原创粉丝点击