2595 X之于Y 思维
小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; }
EPFL - Fighting