超级密码

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2927    Accepted Submission(s): 939

Problem Description
Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.
注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.
 
Input
输入数据的第一行是一个整数T(1<=T<=300),表示测试数据的数量.每组测试数据的第一行是两个整数N(0<=N<=5000)和C(2<=C<=16),其中N表示的是题目描述中的给定十进制整数,C是密码的进制数.测试数据的第二行是一个整数M(1<=M<=16),它表示构成密码的数字的数量,然后是M个数字用来表示构成密码的数字.两个测试数据之间会有一个空行隔开.
注意:在给出的M个数字中,如果存在超过10的数,我们约定用A来表示10,B来表示11,C来表示12,D来表示13,E来表示14,F来表示15.我保证输入数据都是合法的.
 
Output
对于每组测试数据,如果存在要求的密码,则输出该密码,如果密码不存在,则输出"give me the bomb please".
注意:构成密码的数字不一定全部都要用上;密码有可能非常长,不要试图用一个整型变量来保存密码;我保证密码最高位不为0(除非密码本身就是0).
 
Sample Input
3
22 10
3
7 0 1

2 10
1
1

25 16
3
A B C

 
Sample Output
110
give me the bomb please
CCB

Hint

Hint

Huge input, scanf is recommended.

 
Author
Ignatius.L
 
Source
 #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
int T , mod , c , n ;
char a[ + ] ;
bool vis[ + ] ;
int num[] ;
struct node
{
int step , ret ;
node () {}
node (int step , int ret) : step (step) , ret (ret) {}
};
struct link
{
int v , nxt ;
}e[ + ];
void echo (int an)
{
int k = ;
for (int i = an ; ~ i ; i = e[i].nxt) {
if (e[i].v < ) a[k ++] = '' + e[i].v ;
else if (e[i].v >= ) a[k ++] = e[i].v - + 'A' ;
}
// printf ("\nk=%d\n" , k) ;
for (int i = k - ; i >= ; i --) {
printf ("%c" , a[i]) ;
}
printf ("\n") ;
} bool bfs ()
{
int E = - ;
std::queue<node> q ;
while (!q.empty ()) q.pop () ;
memset (vis , , sizeof(vis)) ;
node ans , tmp ;
int cnt = E + ;
for (int i = ; i < n ; i ++) {
if (num[i] != && !vis[num[i]%mod]) {
ans = node ( , num[i]%mod) ;
e[cnt].v = num[i] ; e[cnt].nxt = E ; cnt ++ ;
vis[num[i]%mod] ;
if (num[i]%mod == ) {echo (cnt - ) ; return true ;}
q.push (ans) ;
}
}
// for (int i = 0 ; i < n ; i++) printf ("%d " , num[i]) ; printf ("\n") ;
while (!q.empty ()) {
ans = q.front () ; q.pop () ;
E ++ ;
// printf ("step=%d , ret=%d\n" , ans.step , ans.ret) ;
for (int i = ; i < n ; i++) {
tmp.ret = (ans.ret * c + num[i]) % mod ;
tmp.step = ans.step + ;
// printf ("+%d=(%d)\n" , num[i],tmp.ret) ;
if (tmp.step > ) continue ;
if (vis[tmp.ret]) continue ;
e[cnt].v = num[i] ; e[cnt].nxt = E ; cnt ++ ;
// printf ("(%d)ans.ret=%d\n" , num[i] , ans.ret) ;
if (tmp.ret == ) {echo (cnt - ) ; return true ;}
vis[tmp.ret] = ;
q.push (tmp) ;
}
}
return false ;
} int main ()
{
//freopen ("a.txt" , "r" , stdin ) ;
scanf ("%d" , &T) ;
while (T--) {
scanf ("%d%d%d" , &mod , &c , &n) ;
// printf ("mod=%d,c=%d,n=%d\n" , mod , c , n ) ;
// printf ("hehe :%s\n" , a ) ;
for (int i = ; i < n; i++){
scanf("%s", a);
if (a[] <= '' && a[] >= '') num[i] = a[] - '';
else if (a[] <= 'F' && a[] >= 'A') num[i] = a[] - 'A' + ;
}
std::sort (num , num + n) ;
if (mod == ) {
if (num[] == ) puts ("") ;
else puts ("give me the bomb please") ;
continue ;
}
if ( !bfs () ) puts ("give me the bomb please") ;
}
return ;
}

bfs能用来生成数,给赞啊。规避了大数的做法也很6.

hdu.1226.超级密码(bfs)的更多相关文章

  1. HDU 1226 超级密码(BFS) (还需研究)

    Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Desc ...

  2. HDU 1226 超级密码(数学 bfs)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1226 超级密码 Time Limit: 20000/10000 MS (Java/Others)    ...

  3. hdu 1226 超级密码

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem D ...

  4. hdu 1226 超级密码(bfs+余数判重)

    题意:略过 分析:用m个数字组成一个能够被n整除的c进制数的最小值,实际上本题的关键就在于这个最小值上.  首先确定我们的思路是从小到大寻找.先查看一位数,即查看着m个数字是否能被n整除:若不能,就查 ...

  5. HDOJ 1226 超级密码(bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1226 思路分析:题目要求寻找一串长度不大于500的C进制的密码,且该密码需要为十进制数N的整数倍. & ...

  6. HDU 1226 超级密码 (搜素)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1226 题意简单,本来是一道很简单的搜素题目. 但是有两个bug: 1.M个整数可能有重复的. 2.N可 ...

  7. hdu1226超级密码 bfs

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1226/ 题目大意是:寻找一个五百位之内的C进制密码,该密码是N的正整数倍,而且只能用给定的数构成密码,求这样的密 ...

  8. HDOJ 1226 超级密码

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  9. 超级密码(bfs)

    超级密码 Time Limit : 20000/10000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

随机推荐

  1. Scala可变长度参数

    可变长度参数 Scala 允许你指明函数的最后一个参数可以是重复的.这可以允许客户向函数传入可变长度参数列表.想要标注一个重复参数,在参数的类型之后放一个星号.例如: scala> def ec ...

  2. Deep Learning in NLP (一)词向量和语言模型

    原文转载:http://licstar.net/archives/328 Deep Learning 算法已经在图像和音频领域取得了惊人的成果,但是在 NLP 领域中尚未见到如此激动人心的结果.关于这 ...

  3. hdu 2037 - 今年暑假不AC(区间调度问题)

    题意:区间调度问题 解法:应用贪心算法,贪心的规则: 在可选的节目中,选取结束时间早的节目. 1: #include<stdlib.h> 2: #include<string.h&g ...

  4. python的正则表达式 re-------可以在字符串前加上 r 这个前缀来避免部分疑惑,因为 r 开头的python字符串是 raw 字符串,所以里面的所有字符都不会被转义

    正则表达式使用反斜杆(\)来转义特殊字符,使其可以匹配字符本身,而不是指定其他特殊的含义.这可能会和python字面意义上的字符串转义相冲突,这也许有些令人费解.比如,要匹配一个反斜杆本身,你也许要用 ...

  5. vmware下linux系统的安装过程

    虚拟机VMware下CentOS6.6安装教程图文详解 [日期:2016-05-24] 来源:Linux社区  作者:Sungeek [字体:大 中 小]   分享下,虚拟机VMware下CentOS ...

  6. 第3章 基本概念(第一部分:Js语法)

    本章就JavaScript常用功能而言阐述ECMAScript“伪语言”所描述的概念. 一. 语法 1.大小写规则 js语言本身对大小写不敏感,但是一切变量.函数.操作符都对大小写敏感. 2.注释格式 ...

  7. VBO, VAO, Generic Vertex Attribute

    VBO - 用于存储顶点数据的Buffer Object. VAO - 用于组织VBO的对象. Generic Vertex Attribute - 通用顶点属性. For example, the ...

  8. jquery 停止animate动画,并且回复最初状态

    // 热门推荐悬浮效果 $("#recom_con li img").mouseenter(function(){ $(this).stop(true, true); $w = p ...

  9. 扩展服务 修改新增Service的默认主题

    问题描述:想要在F:\PHPnow-1.5.6\htdocs\yt\Yourphp\Tpl\      目录下新增一个Service\Default(A)   和Service\new(B) 两个主题 ...

  10. live555在Raspberry Pi上的点播/直播

    1.live555在Raspberry Pi上的点播 live555MediaServer这个实例是个简单的服务器,支持多媒体点播,直接在Raspberry Pi上编译运行,或者通过交叉编译出ARM核 ...