POJ 1465 Multiple(用BFS求能组成的n的最小倍数)
来源:互联网 发布:caxa工程师编程实例 编辑:程序博客网 时间:2024/05/19 16:37
题目地址:点击打开链接
题意:给一个数n,接着给m个数,用给已知的m个数组成的数最小的能被n整除的数是多少(其中m个数可以重复使用)
思路:和HDU1226有点相似,只不过比那道题简单,这里面m的数值没有说明,但是可以猜出来,问题的解空间是m^m,所以开一个大小为50的数组足够了,组成的数可以很大,必须不断取模,而且解空间太大,必须用同余减枝,而且必须减枝,否则第二个测试案例就出错误,因为程序会陷入死循环,假设A%N==B%N(设A<B),那么只取前面的数即可,因为前面的数小。本质就是求l%n==0,问最小的l是多少,假设组成l的数为A和B,则求(A%N+B)%N ==0,注意B不能对n取余,看代码注释掉的部分,会造成RE,没搞明白为啥,只搞明白有一种情况会出错,如m个数中有一个数和n相同,提前对m个数组取模会造成错误
AC代码:
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cstring>#include <climits>#include <cmath>#include <cctype>typedef long long ll;using namespace std;int a[50];int n,m;int visit[5000];struct node{ int now; int pre; int id; int wei;}cf[5000],lol;void shuchu(int id){ if(cf[id].pre == -1) { return; } shuchu(cf[id].pre); printf("%d",cf[id].wei);}void bfs(){ int i,k=0; queue<node> que; cf[k].now = 0; cf[k].pre = -1; cf[k].id = k; que.push(cf[k]); while(!que.empty()) { lol = que.front(); que.pop(); for(i=0; i<m; i++) { if(!visit[(lol.now*10+a[i])%n] && (lol.id != 0 || a[i] > 0))//与后面的语句必须加因为第一个数不可能为0 { k++; cf[k].now = (lol.now*10+a[i])%n; cf[k].pre = lol.id; cf[k].wei = a[i]; cf[k].id = k; visit[cf[k].now] = 1; if(cf[k].now == 0) { shuchu(k); printf("\n"); return; } que.push(cf[k]); } } } printf("0\n");}int main(){ int i; while(scanf("%d%d",&n,&m) != EOF) { memset(visit,0,sizeof(visit)); for(i=0; i<m; i++) { scanf("%d",&a[i]); //a[i] = a[i] % n; } sort(a,a+m); if(n == 0) { printf("0\n");//这里包含2种情况,n为0是最小倍数一定为0 ,a数组中没0时,没法组成0的最小倍数时,输出的也是0 } else { bfs(); } } return 0;}
大神地址:点击打开链接
0 0
- POJ 1465 Multiple(用BFS求能组成的n的最小倍数)
- POJ 1465-Multiple(BFS-最小整倍数)
- POJ 1426 Find The Multiple && 51nod 1109 01组成的N的倍数 (BFS + 同余模定理)
- 51nod 01组成的N的倍数(bfs)
- 51nod 1109 01组成的N的倍数(bfs)
- 51nod 1109 01组成的N的倍数 (bfs)
- n的倍数BFS小水题
- 求给定M个数组合构成N的最小倍数
- 51nod1109(01组成的n的倍数)
- 01组成的N的倍数
- ACM_51nod_1109_01组成的N的倍数
- 51nod 1109 01组成的N的倍数【Bfs+同余定理剪枝】好题!
- 广搜搜法找出只有1和0组成的n的最小倍数问题
- poj 1465 求一个数的最小倍数满足一个条件
- poj 2356 Find a multiple 【抽屉原理应用】【在n个数组成的数列中找出若干个连续数使它们之和能被n整除】
- HDOJ 题目4474 Yet Another Multiple Problem(bfs,技巧,找一个数的倍数)
- 百度一道笔试题(求n个整数连成一排组成的最小整数)
- 51nod-1109 01组成的N的倍数(宽搜)
- [MSDN] Windows Server 2012 R2 简/繁/英下载
- asp.net calender控件显示一周之内的日期
- java动态代理的实现
- nginx 配置摘要
- 使用Qt开发文本编辑器(一):功能介绍
- POJ 1465 Multiple(用BFS求能组成的n的最小倍数)
- MySQL配置文件my.cnf中各【】块解释
- eclipse 工程导入 android studio
- 短信发送格式
- 一文读懂机器学习,大数据/自然语言处理/算法全有了……
- android.mk的语法
- leetcode笔记:Happy Number
- LeetCode 022 Generate Parentheses
- 常见高级组件之Gallery