题解报告:hdu 1015 Safecracker
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."
“该物品被锁在二楼图书馆一幅油画后面的克莱恩保险柜中,克莱因保险柜非常罕见,其中大部分与克莱恩及其工厂一起在二战时被摧毁。幸运的是,老布鲁博从研究中知道克莱因在他去世前写下他们的秘密,一个克莱因保险箱有两个显着特点:一个使用字母而不是数字的组合锁,以及一扇刻在门上的刻字引号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认为在雕刻中对组合进行编码是安全的,因为即使你知道秘密也需要数月的努力来尝试所有的可能性,但当然电脑当时并不存在。”
#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的更多相关文章
- HDOJ(HDU).1015 Safecracker (DFS)
HDOJ(HDU).1015 Safecracker [从零开始DFS(2)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HDOJ.1 ...
- hdu 1015 Safecracker 水题一枚
题目链接:HDU - 1015 === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Klein s ...
- ZOJ 1403&&HDU 1015 Safecracker【暴力】
Safecracker Time Limit: 2 Seconds Memory Limit: 65536 KB === Op tech briefing, 2002/11/02 06:42 ...
- HDU 1015 Safecracker【数值型DFS】
Safecracker Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 1015 Safecracker(第一次用了搜索去遍历超时,第二次用for循环能够了,思路一样的)
Safecracker Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total S ...
- HDU 1015.Safecracker【暴力枚举】【8月17】
Safecracker Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is lo ...
- HDU 1015 Safecracker
解题思路:这题相当诡异,样例没过,交了,A了,呵呵,因为理论上是可以通过的,所以 我交了一发,然后就神奇的过了.首先要看懂题目. #include<cstdio> #include< ...
- HDOJ/HDU 1015 Safecracker(深搜)
Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...
- HDOJ/HDU 1015 Safecracker(枚举、暴力)
Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...
随机推荐
- Netbeans工具使用记录
#自动换行设置 工具->选项->编辑器->格式设置
- 自己打断点走的struts流程&拦截器工作原理
①. 请求发送给 StrutsPrepareAndExecuteFilter ②. StrutsPrepareAndExecuteFilter 判定该请求是否是一个 Struts2 请 求(Actio ...
- P1160 队列安排 洛谷
https://www.luogu.org/problem/show?pid=1160 题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进 ...
- MongoDB学习day03--索引和explain分析查询速度
一.索引基础 db.user.ensureIndex({"username":1}) 创建索引,username为key,数字 1 表示 username 键的索引按升序存储, - ...
- Ubuntu 16.04通过Magent搭建Memcached集群(转)
一.下载Magent 官网:https://code.google.com/archive/p/memagent/downloads 离线版本:(链接: https://pan.baidu.com/s ...
- JSP的EL表达式语言
以下内容引用自http://wiki.jikexueyuan.com/project/jsp/expression-language.html: JSP表达式语言(EL)可以方便地访问存储在JavaB ...
- mysql-performance-schema
http://www.fromdual.com/mysql-performance-schema-hints http://www.cnblogs.com/cchust/
- restful接口就是url嘛,通过http请求发起访问。那接口进行监控,就可以监控这个restful url嘛
EasyAPI接口管理系统 专注API接口监控,让您的API接口更稳定,与APP更紧密 + 购买监控服务 接口性能分析 分析App对应的API接口请求性能,包含HTTP响应时间.吞吐率.HTTP错误率 ...
- SGU 439 A Secret Book
解法: 对于第二个串,循环移动能得到的字典序最小的串,可以直接用最小表示法搞定. 然后用最小表示的第二个串和第一个串做两次扩展KMP,一次正常求,另外一次将两个串都反转一下,然后扫一遍ex[]数组 # ...
- shell脚本 加密备份MySQL数据库
1.加密备份为.bak文件(实际只是个.zip文件) #!/bin/bash # $:IP地址 # $:用户名 # $:数据库密码 # $:数据库名 # $:加密密码 # $:备份文件名 mysqld ...