Two Buttons
题目描述
大致题意
给你两个整数n,m,每次可以在两次操作中选择一个操作:
- 将 n 乘以 2
- 将 n 减去 1
问最少需要多少次操作可以使得 n == m
思路
乍一看最小操作次数,首选方法bfs,但是该题数据量过大,不适宜用bfs。
可以尝试考虑贪心的思路。
可以看出可选择的操作没有除,所以如果 n 比 m 大只能 一直减一。
选哪种操作最划算呢?
看样子得多用乘法比较划算,我问当然希望能一路乘到结果,但是这样的话n得是m的二分之一,四分之一,八分之一…
但是我们不好权衡是乘了之后再减还是减了之后再乘。
不妨逆向思考一下,我们用m得到n,每次m除以二或者是加一,这样一来我们就能一直除,直到m不大于n为止。
如果m为奇数,加一,否则除以二
代码
a, b = list(map(int, input().split(" ")))
ans = 0
while a < b:
if b % 2 == 1:
b += 1
ans += 1
b //= 2
ans += 1
ans += a - b
print(ans)