Problem Description
=== Op tech briefing, 2002/11/02 06:42 CST ===  "The item is locked in a Klein safe behind a painting in the second-floor library. Klein safes are extremely rare; most of them, along with Klein and his factory, were destroyed in World War II. Fortunately old Brumbaugh from research knew Klein's secrets and wrote them down before he died. A Klein safe has two distinguishing features: a combination lock that uses letters instead of numbers, and an engraved quotation on the door. A Klein quotation always contains between five and twelve distinct uppercase letters, usually at the beginning of sentences, and mentions one or more numbers. Five of the uppercase letters form the combination that opens the safe. By combining the digits from all the numbers in the appropriate way you get a numeric target. (The details of constructing the target number are classified.) To find the combination you must select five letters v, w, x, y, and z that satisfy the following equation, where each letter is replaced by its ordinal position in the alphabet (A=1, B=2, ..., Z=26). The combination is then vwxyz. If there is more than one solution then the combination is the one that is lexicographically greatest, i.e., the one that would appear last in a dictionary." 
v - w^2 + x^3 - y^4 + z^5 = target 
"For example, given target 1 and letter set ABCDEFGHIJKL, one possible solution is FIECB, since 6 - 9^2 + 5^3 - 3^4 + 2^5 = 1. There are actually several solutions in this case, and the combination turns out to be LKEBA. Klein thought it was safe to encode the combination within the engraving, because it could take months of effort to try all the possibilities even if you knew the secret. But of course computers didn't exist then." 
=== Op tech directive, computer division, 2002/11/02 12:30 CST === 
"Develop a program to find Klein combinations in preparation for field deployment. Use standard test methodology as per departmental regulations. Input consists of one or more lines containing a positive integer target less than twelve million, a space, then at least five and at most twelve distinct uppercase letters. The last line will contain a target of zero and the letters END; this signals the end of the input. For each line output the Klein combination, break ties with lexicographic order, or 'no solution' if there is no correct combination. Use the exact format shown below."
译文:=== Op科技简报,2002/11/02 06:42 CST === 
“该物品被锁在二楼图书馆一幅油画后面的克莱恩保险柜中,克莱因保险柜非常罕见,其中大部分与克莱恩及其工厂一起在二战时被摧毁。幸运的是,老布鲁博从研究中知道克莱因在他去世前写下他们的秘密,一个克莱因保险箱有两个显着特点:一个使用字母而不是数字的组合锁,以及一扇刻在门上的刻字引号Klein引用总是包含5到12个不同的大写字母,通常在句子的开头,并提到一个或多个数字。大写字母组成打开的安全相结合,通过数字从所有的数字中,你得到一个数字目标适当的方式合并。(建设目标的细节五号码被分类。)要找到组合,您必须选择满足以下等式的五个字母v,w,x,y和z,其中每个字母由其在字母表中的顺序位置替换(A = 1,B = 2,...,Z = 26)。这个组合就是vwxyz。如果有多个解决方案,那么这个组合就是词典上最大的那个,也就是最后出现在字典中的那个。“v - w ^ 2 + x ^ 3 - y ^ 4 + z ^ 5 =目标”例如,给定目标1和字母集ABCDEFGHIJKL,一个可能的解决方案是FIECB,因为6 - 9 ^ 2 + 5 ^ 3 - 3 ^ 4 + 2 ^ 5 = 1。在这种情况下实际上有几个解决方案, Klein认为在雕刻中对组合进行编码是安全的,因为即使你知道秘密也需要数月的努力来尝试所有的可能性,但当然电脑当时并不存在。”
=== Op技术指令,计算机部门,2002/11/02 12:30 CST ===
“制定一个程序,以发现Klein组合,为野外部署做准备,按照部门规定使用标准测试方法,输入包含一个或多个行,其中包含一个不超过1200万的正整数,一个空格,然后至少5个,最多 十二个不同的大写字母,最后一行将包含零和字母END的目标;这表示输入结束,对于每行输出的克莱因组合,断开与字典顺序的关系,或者如果没有 正确的组合,请使用下面显示的确切格式。“
Sample Input
1 ABCDEFGHIJKL
11700519 ZAYEXIWOVU
3072997 SOUGHT
1234567 THEQUICKFROG
0 END
Sample Output
LKEBA
YOXUZ
GHOST
no solution
解题思路:题目的意思就是给你一个字母字符串,从中找出5个字母组成最大字典序,并且满足那个表达式,深搜算法即可解决。注意慎用pow函数会有误差,此处用了一个函数单独判断是否满足表达式,当表达式满足后还要判断当前的字符串t是否大于字符串g,是的话就拷贝覆盖字符串g,g就成为最大的字典序字符串。
AC代码:
 #include<bits/stdc++.h>
using namespace std;
char s[],t[],g[];//s是输入的一串,t是临时保存字母,g是存放最终的5个字母(最大字典序)
int target,len,a[];//a数组来保存字母对应的数字
bool vis[];
bool isobj(int v,int w,int x,int y,int z,int tar){
if(v - w*w + x*x*x - y*y*y*y + z*z*z*z*z == tar) return true;
else return false;
}
void dfs(int k)
{
if(k==){//边界条件
if(isobj(a[t[]-'A'],a[t[]-'A'],a[t[]-'A'],a[t[]-'A'],a[t[]-'A'],target) && strcmp(t,g)>)
strcpy(g,t);//与目标相等时,还要按照字典序较大的输出
return;//回溯,返回上一层
}
for(int i=;i<len;i++){//遍历字符串
if(!vis[s[i]-'A']){//如果当前字母没有访问
t[k]=s[i];//先存到t数组中
vis[s[i]-'A']=true;//并标记为暂时的访问过
dfs(k+);//从每个当前位置进行深搜
vis[s[i]-'A']=false;//不满足条件的把原来标记的记为未访问过(回溯)
}
}
}
int main()
{
for(int i=;i<;i++)a[i]=i+;//对26个字母进行编号赋值
while(cin>>target>>s && (target||strcmp(s,"END"))){
memset(vis,false,sizeof(vis));//初始化为假值,表示都未访问过
memset(g,'\0',sizeof(g));//全部赋为'\0',便于拷贝和整体输出
memset(t,'\0',sizeof(t));
len=strlen(s);//目标字符串的长度
dfs();//从第0个目标字符开始深搜
if(strlen(g)==)cout<<"no solution"<<endl;//如果g的长度仍是0,则没有解
else cout<<g<<endl;//否则输出g字符串
}
return ;
}

以上是深搜目标字符串,找出其中最大字典序字符串,但其实我们只需要将目标字符串中的字母进行降序排列,然后深搜找到第一个满足表达式的字符串,即为最大字典序字符串。AC解法二代码:

 #include<bits/stdc++.h>
using namespace std;
char s[],t[];//s是输入的一串,t是临时保存字母
int target,len,a[];//a数组来保存字母对应的数字
bool flag,vis[];//flag标记是否找到
bool isobj(int v,int w,int x,int y,int z,int tar){
if(v - w*w + x*x*x - y*y*y*y + z*z*z*z*z == tar) return true;
else return false;
}
void dfs(int k)
{
if(k==){//边界条件
if(isobj(a[t[]-'A'],a[t[]-'A'],a[t[]-'A'],a[t[]-'A'],a[t[]-'A'],target) && !flag){
flag=true;cout<<t<<endl;//找到第一个字符串直接输出即可,此时就是最大字典序
}
return;//直接返回
}
for(int i=len-;i>=;--i){//从后往前遍历字符串
if(!vis[s[i]-'A']){//如果当前字母没有访问
t[k]=s[i];//先存到t数组中
vis[s[i]-'A']=true;//并标记为暂时的访问过
dfs(k+);//从每个当前位置进行深搜
vis[s[i]-'A']=false;//不满足条件的把原来标记的记为未访问过(回溯)
}
}
}
int main()
{
for(int i=;i<;i++)a[i]=i+;//对26个字母进行编号赋值
while(cin>>target>>s && (target||strcmp(s,"END"))){
memset(vis,false,sizeof(vis));//初始化为假值,表示都未访问过
memset(t,'\0',sizeof(t));
len=strlen(s);//目标字符串的长度
flag=false;sort(s,s+len);//排序
dfs();//从第0个目标字符开始深搜
if(!flag)cout<<"no solution"<<endl;//找不到
}
return ;
}

题解报告:hdu 1015 Safecracker的更多相关文章

  1. HDOJ(HDU).1015 Safecracker (DFS)

    HDOJ(HDU).1015 Safecracker [从零开始DFS(2)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HDOJ.1 ...

  2. hdu 1015 Safecracker 水题一枚

    题目链接:HDU - 1015 === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Klein s ...

  3. ZOJ 1403&&HDU 1015 Safecracker【暴力】

    Safecracker Time Limit: 2 Seconds      Memory Limit: 65536 KB === Op tech briefing, 2002/11/02 06:42 ...

  4. HDU 1015 Safecracker【数值型DFS】

    Safecracker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  5. HDU 1015 Safecracker(第一次用了搜索去遍历超时,第二次用for循环能够了,思路一样的)

    Safecracker Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total S ...

  6. HDU 1015.Safecracker【暴力枚举】【8月17】

    Safecracker Problem Description === Op tech briefing, 2002/11/02 06:42 CST ===  "The item is lo ...

  7. HDU 1015 Safecracker

    解题思路:这题相当诡异,样例没过,交了,A了,呵呵,因为理论上是可以通过的,所以 我交了一发,然后就神奇的过了.首先要看懂题目. #include<cstdio> #include< ...

  8. HDOJ/HDU 1015 Safecracker(深搜)

    Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...

  9. HDOJ/HDU 1015 Safecracker(枚举、暴力)

    Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...

随机推荐

  1. 括号序列(Poj1141)

    Poj1141 题目描述: 定义合法的括号序列如下: 1 空序列是一个合法的序列 2 如果S是合法的序列,则(S)和[S]也是合法的序列 3 如果A和B是合法的序列,则AB也是合法的序列 例如:下面的 ...

  2. 【http_load】http_load性能测试工具使用详解

    1.什么是http_loadhttp_load是一款基于Linux平台的web服务器性能测试工具,用于测试web服务器的吞吐量与负载,web页面的性能. 2.http_load的安装1)下载地址wge ...

  3. [bzoj1324]Exca王者之剑_最小割

    Exca王者之剑 bzoj-1324 题目大意:题目链接. 注释:略. 想法: 最小割经典模型. 所有格子向源点连权值为格子权值的边. 将棋盘黑白染色后白点反转源汇. 如果两个格子相邻那么黑点向白点连 ...

  4. hibernate详解一

    hibernate介绍 hibernate是一个开源的轻量级的框架, hibernate框架应用在javaee三层结构中的dao层框架,在dao层对数据库进行crud操作,使用hibernate框架实 ...

  5. Redis基于Java的客户端SDK收集

    如果要找这类的SDK,第一反应应该直奔官网,找一下看下有什么推荐.先找最权威的回答,找不到再尝试民间方案. 就Redis来说,官方已经提供了一个列表包括市面上绝大多数语言的SDK,可以参考以下网址看J ...

  6. dtrace-conf 2016

    https://www.joyent.com/about/events/2016/dtrace-conf

  7. centos 建立Clamav自动扫描脚本

    vim autoscan.sh #建立自动扫描脚本 #!/bin/bash PATH=/usr/bin:/bin CLAMSCANTMP=`mktemp` clamdscan --recursive ...

  8. Hdu2111

    <span style="color:#6600cc;">/* J - Saving HDU Time Limit:1000MS Memory Limit:32768K ...

  9. 免安装版TOMCAT配置及问题解决方法

    前言 本文将介绍下面几点内容: 1.Tomcat的配置过程 2.启动startup过程中遇到的问题的解决 3.假设遇到本文中没有提到的问题怎样解决 配置 计算机右击->属性->高级系统设置 ...

  10. 2013级C++第12周(春)项目——成员的訪问属性、多重继承

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读 1.阅读程序.分析类中成员 ...