首页 > 代码库 > hdu 1015 - Safecracker
hdu 1015 - Safecracker
题目:字母‘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; }
hdu 1015 - Safecracker
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。