小Y上课无聊摸鱼,他在纸上随意写下了两个数字X和Y。现在他想把X通过某种方法变成Y,为了把让这个过程更加有趣,所以他限定自己只能使用两种操作:
1、把当前X乘二
2、把当前X减一
因为课堂上的时间有限,所以他用了最少的操作次数实现这一过程。下课后,路过的qz看到了小Y纸上写着的X和Y,他一秒钟以内就知道了小Y用了多少次操作。那么问题来了,小Y到底用了多少次操作呢?
输入
两个数字表示X和Y 其中 1<= X <= 1,000,000,000 1<= Y <= 1,000,000,000
输出
一个数字,表示把X变成Y最少需要多少次操作
输入样例
1 1000000000
输出样例
39
考虑由y变成x,那么只有2种操作:1.y/=2 2.y+=1 ;
当y为奇数,那么只能执行第二种:y+=1变为偶数
当y为偶数,考虑将其变为y/2,那么直接除即可;如果变成y/2+1,第一种就是先除再加 1,操作为2步;否则就是加2然后再/2,操作为3步;
所以对于偶数的情况,先除再加更优;
那么整个解法就出来了:对于是偶数的就/2,对于y<x的情况,就加上(x-y)即可;
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int maxn = 2010;
typedef long long ll;
#define rdint(x) scanf("%d",&x)
#define inf 0x3f3f3f3f
int x, y;
int main()
{
rdint(x); rdint(y);
int minn = inf;
int cnt = 0;
while (1) {
if (x == y)break;
if (y % 2 == 0 && y > x) {
cnt++; y /= 2;
}
else if (y > x&&y % 2 == 1) {
cnt++; y += 1;
}
else if (y < x) {
cnt += (x - y);
y = x; break;
}
}
cout << cnt << endl;
system("pause");
// return 0;
}