博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Multiple
阅读量:4325 次
发布时间:2019-06-06

本文共 2021 字,大约阅读时间需要 6 分钟。

poj1465:

题意:给你一个数n(0~4999);以及m个不同十进制的数,问有这些十进制数组成的最小的n的倍数是多少。如果有则输出,没有就输出0;

题解:此题用BFS 。。这个题好在 用 余数判重剪枝。。BFS 如果不加以剪枝,一定会搜索的情况会很庞大。所以应该用余数判重 。

为什么可以用余数判重?
   A=a*N +e 即A%N =e
   B= b*N+e即B%N=e
当A  B mod N的余数相同时,如果先出现A 。在A  后加上一个数 i 时 ,  新的数   C = 10 *a*N + 10 *e+i;同样  B后加上数 i 时 , D = 10*b*N +10*e+i;    由于C D 前边 10*a*N 和 10*b*N 都是N的倍数 ,则C D mod N 的余数都是有 10*e+i 决定的。于是 C D  mod N 同余。因此 A B 同余 都添加上 i 之后 新的两个数C D也是同余的。在无论添加多少个数,新生成的两个数也是同余的。因此 在A 之后如果不出现 N的倍数 ,则在B之后也不会出现。 在A 之后出现,那B之后也会出现。  有因为要求求最小值。所以只需要搜索min(A,B)之后的 ,对于另外一个数之后就不用搜索了。因为对M个排序后,先填入的是小的值,所以 A B 先出现的值小。所以后出现的同余的数 就不用搜索了。因此可以余数判重后剪枝。。。。

1 #include
2 #include
3 #include
4 #include
5 #define INF 1000000000 6 using namespace std; 7 int n,m,d[150]; //d数组用来储存m个数 8 struct point{ 9 int yu;//记录余数10 int pre;//记录来自哪一层11 int now; //记录当前的是哪一个d【i】;12 }que[10000];13 int cmp(const void * a,const void * b){14 int * aa=(int *)a;15 int * bb=(int *)b;16 return *aa-*bb;17 } //比较器从小到大18 void print(int tem){19 if(que[tem].pre!=-1){20 print(que[tem].pre);21 printf("%d",que[tem].now);22 }23 }//递归输出24 int bfs(){25 int front=0,rear=0;26 int flag[5010];//标记是否访问27 que[rear].now=0;28 que[rear].pre=-1;29 que[rear++].yu=0;30 memset(flag,0,sizeof(flag));31 while(front
0)){37 struct point st;38 st.now=d[i];39 st.yu=temp;40 st.pre=front;41 flag[temp]=1;42 que[rear++]=st;43 if(temp==0){44 print(rear-1);45 printf("\n");46 return 1;47 }48 }49 }50 front++;51 }52 return 0;53 }//在大脑中一定要有完整清晰的思路。54 int main(){55 int i;56 while(scanf("%d",&n)!=EOF){57 scanf("%d",&m);58 for(i=0;i
View Code

 

转载于:https://www.cnblogs.com/chujian123/p/3366457.html

你可能感兴趣的文章
初识前端作业1
查看>>
为啥程序会有bug?
查看>>
跨域技术
查看>>
JS里的居民们7-对象和数组转换
查看>>
计算两个日期的时间间隔,返回的是时间间隔的日期差的绝对值.
查看>>
python初体验
查看>>
配置vue,vue脚手架的应用(老版本)
查看>>
Start with PJSIP on windows
查看>>
【图像处理】ISP 图像传感器camera原理
查看>>
linux下防火墙iptables原理及使用
查看>>
Android 使用手机向手表安装任意.apk
查看>>
Android实时直播,一千行java搞定不依赖jni,延迟0.8至3秒,强悍移动端来袭
查看>>
无刷新上传图片 可以实时预览 选择图片后即自动上传,没有上传按钮
查看>>
DB2分区表删除和添加分区
查看>>
浅析C#中new、override、virtual关键字的区别
查看>>
jacoco+maven 初次使用覆盖率工具
查看>>
Linux笔记--Linux进程通信
查看>>
jpype测试报错,找不到类raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)
查看>>
0x01-1 原码 反码 补码 概念 原理 详解
查看>>
Nowcoder 提高组练习赛-R2
查看>>