POJ1426 - BFS

本文详细介绍了如何通过BFS算法优化解决特定数位组成的数与其整数倍数的问题,包括算法设计、实现细节及优化策略。通过引入打表法和循环范围调整,成功解决了效率低下和超时的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目的意思是写出一个只由0,1组成的数...这个数位做给数的整数倍...

开始我是依次生成每个0,1数...再check是不是倍数...然后一跑..效率太低了...就说打表...打了1个小时都出不来...后来一看只打到了16..200个估计一天是搞不定了...

后来想到我可以BFS...从第位向高位的来确定乘数...因为乘数的个位数确定了..那么积的个位就确定了..如果乘数的个位和十位都确定了...那么积的十位和个位就都确定了...依次类推...保证每次进入队列的数除后面几位都只由0,1组成....直到所有数都是由0,1组成就找到了解..这题是Special Judge...找到了就输出就行了...

在BFS的时候...我循环0~9...都能出解...但交上去居然超时....实在我是离线打表..打表时间目测一闪而过...后面就是来一个出一个....这都能TLE...好吧....干脆就把循环开成1~9试一试....结果发现就一个数的解出不来...n=36...最小的乘积应该是11111111100...如果循环开成1~9..那么再下一个就爆了long long了..无奈..就这个数不行...我就萎缩的直接输出了这个解了....


Program :

#include<iostream> #include<queue> using namespace std; struct pp { int k; long long data,PowOfTen; }h,p; queue<pp> myqueue; int i,n; bool ok(pp k) { long long p=k.data; if (!p) return false; while (p>0) { if (p%10!=1 && p%10!=0) return false; p/=10; } return true; } long long ans[201]; int main() { for (n=1;n<=200;n++) { if (!n) break; while (!myqueue.empty()) myqueue.pop(); p.data=0; p.k=0; p.PowOfTen=1; myqueue.push(p); while (!myqueue.empty()) { h=myqueue.front(); myqueue.pop(); for (i=1;i<=9;i++) if ((i*n%10+h.k)%10==1 || (i*n%10+h.k)%10==0) { p=h; p.data+=h.PowOfTen*i*n; p.PowOfTen*=10; p.k=(int)(p.data/p.PowOfTen); if (ok(p)) goto A; myqueue.push(p); } } A: ans[n]=p.data; } ans[36]=11111111100ll; while (~scanf("%d",&n)) { if (!n) break; printf("%I64d\n",ans[n]); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值