题目链接:Two Buttons
题目大意:
给你两个正整数 n 和 m。以下操作可以进行任意次
操作一:n = n * 2
操作二:n = n - 1
问将n变成m的最小操作次数。
解题思路:
当 n ≥ m 时,毋庸置疑答案为n - m。
当 n < m 时,分以下两种情况:
- m为偶数时,他一定是某个数一直执行操作一得到的,所以我们一直让m除以2,终止的条件为m%2 != 0或者m ≤ n,若m ≤ n答案为执行的次数+ (n - m),若最后m > n,那么答案为执行的次数+ n到新的m的操作次数(递归求解)。
- m为奇数时,他一定是从m+1执行操作二得到的,所以答案为1 + n到m+1的操作次数。
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
int fact(int n, int m)
{
if (n >= m) return n - m;
else if (m % 2 == 0)
{
int cnt = 0;
while (m % 2 == 0)
{
m /= 2; cnt++;
if (m <= n) break;
}
if (m <= n) return cnt + n - m;
else return cnt + 1 + fact(n, m + 1);
}
else return 1 + fact(n, m + 1);
}
int main()
{
int n, m;
cin >> n >> m;
cout << fact(n, m) << endl;
return 0;
}