返回信息流定义一种变换:把一个数字变成本身加上或减去它某一位上的数字,规定不能变换出比1小或比10^6大的数。
对于给定数字a,问最少多少次变换可以得到数字b,如果永远都得不到数字b,输出-1.
输入:一行 两个整数a和b 1<=a,b<=10^6
输出:一行 一个整数,表示变换次数(或-1).
这应该是一个简单题,但是我就是分析不清楚到底该用什么算法来实现。求大牛帮解惑。
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #98068同步于 2019/7/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
问题求教
slptiger
2019/7/5镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
但是怎么判断是不是完全无法获得呢?我之前觉得应该对出现过的数、小于1或大于10^6的树枝去掉,但是又觉得这样也挺复杂。
【 在 a2013211232 的大作中提到: 】
: 求最短用bfs,总共10∧6,完全ok
用记忆化去做
把所有出现的数给记着,访问过的就不再访问了
即,不丢进bfs的队列(或者dfs就不继续往下走了)
【 在 slptiger 的大作中提到: 】
: 但是怎么判断是不是完全无法获得呢?我之前觉得应该对出现过的数、小于1或大于10^6的树枝去掉,但是又觉得这样也挺复杂。
BFS,维护一个队列和visited[10^6],对于已经visited过的就不再加入队列(剪枝),树的层数是答案。但是,如何判断无法到达呢?会不会等队列为空,然后再check一下visited[b]呢,复杂度会不会太高?
觉得这是个整数规划问题,假设a,b可以表示成a=a1a2...an的形式,那么b=k1a1+k2a2+...+k3a3+a.所以求k1,k2...kn的值,且满足约束。如果不存在整数解或不满足条件,那么无解,存在,那么想个办法尽量我们最大的数替换小的数,感觉贪婪的方法就能搞定。最后系数的和就是最小变换次数。
另外规定不能变换出某区间外的值,如果变出去,那么是否可以找到一个类似于取模的方法把它拉回来???