zoj 1136 Multiple(bfs+数论+string)
2011-12-10 13:37
295 查看
题意:求N的最小的正整数倍数是否能由给出的M个整数给出。
分析:本题是1530的加强版。先将M个数排序,再广搜之。关键在与根据同余定理判重。凡是被搜过的接点都不必再搜。标记数组的大小不会超过5000因为N<5000.
还有的话就是存数,据说longlong能行,但这种题目还是用字符串来做合适点。
学习了下string用法。
分析:本题是1530的加强版。先将M个数排序,再广搜之。关键在与根据同余定理判重。凡是被搜过的接点都不必再搜。标记数组的大小不会超过5000因为N<5000.
还有的话就是存数,据说longlong能行,但这种题目还是用字符串来做合适点。
学习了下string用法。
#include <cstdio>//1136:关键是剪枝,方法1:运用同余可知 #include <string>//据说不用字符串,long long也能解决,不过这种题目还是用字符串比较正常 #include <iostream> #include <queue> #include<stdlib.h> #include <string.h> using namespace std; typedef struct mul{ string num; int tmp; }mul; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int N,M,x[10]; int flag[5005]; queue<mul>Q; int bfs() { int i,tt; mul head,temp; temp.tmp=0; temp.num=""; Q.push(temp); while (!Q.empty ()) { head=Q.front (); Q.pop (); for(i=0;i<M;i++) { tt=head.tmp *10+x[i]; if(!tt) continue; if(tt%N==0) { cout<<head.num<<(char)(x[i]+'0')<<endl; return 0; } if(!flag[tt%N]) { flag[tt%N]=1; temp.tmp=tt%N; temp.num=head.num+(char)(x[i]+'0'); Q.push(temp); } } } cout<<"0"<<endl; } int main() { int i; while(~scanf("%d",&N)) { cin>>M; for(i=0;i<M;i++) { cin>>x[i]; } qsort(x,M,sizeof(x[0]),cmp); while(!Q.empty ()) Q.pop (); memset(flag,0,sizeof(flag)); if(N==0) cout<<"0"<<endl;//不能忘记N=0的情况,竟然会FLE else bfs(); } return 0; }
相关文章推荐
- zoj 1136 Multiple(数学+bfs)
- ZOJ 1136 Multiple(BFS + 数论 同余剪枝 搜索数字的倍数 )
- ZOJ - 1136 Multiple (同余+BFS)
- 广度优先搜索,分支限界- ZOJ - 1136 Multiple
- ZOJ 1136 Multiple( 搜索 BFS )
- ZOJ 1136 Multiple(分支界限算法)
- zoj 1136 Multiple
- ZOJ 1136 Multiple
- zoj 1136 Multiple
- ZOJ 1136 Multiple BFS 取模 POJ 1465
- zju/zoj 1136 Multiple(BFS)
- ZOJ 1136 / POJ 1465 Multiple
- ZOJ 1136 Multiple(BFS)
- zoj 1136 Multiple
- POJ 1465/ ZOJ 1136 : Multiple - BFS,余数判重
- ZOJ 1136 Multiple BFS(POJ 1465)
- zoj 1530 Find The Multiple(bfs)
- ZOJ1450 BZOJ1136 BZOJ1137 HDU3932[最小圆覆盖]
- ZOJ 1136 Multiply
- zoj1530 Find The Multiple