Vasya 发现了一个奇怪的设备。在设备的前面板上,有一个红色按钮、一个蓝色按钮和一个显示了某个正整数的屏幕。在按下红色按钮之后,设备将显示的数字乘以 2。在按下蓝色按钮之后,设备将显示的数字减去 1。如果在某时刻,数字不再是正数,则设备终止运行。显示屏幕可以显示任意大的数字。初始状态下,显示屏幕显示了数字 n 。
Bob 想要在显示屏幕上得到数字 m 。为了获得这个结果,他最小需要按下多少次按钮?
输入的第一行 (也是唯一的一行),包含了两个不同的整数 n 和 m (1 ≤ n, m ≤ 104),以空格间隔。
打印仅有的一个数字 — 为了从数字 n 得到数字 m,必须最少按下多少次按钮。
输入
4 6
输出
2
输入
10 1
输出
9
在第一个示例中,需要按下蓝色按钮 1 次,然后按下红色按钮 1 次。
在第二个示例中,数字不必乘以 2,因此我们需要按下蓝色按钮 9 次。
这个题可以用bfs,可是我不是很懂bfs;
这个题有个很特殊的地方就是有n >m的地方而这样就可以偷懒,直接的次数=n-m
相比较减1,乘2是比较快的,就可以得到这样个方法
如果n>m 则次数就为n-m;
如果n<m&&m为偶数时 可得m=m/2一直下去直到m<n; 然后在相加;
如果n<m&&m为奇数时 可给m+1然后在相除直到m<n,然后在相加;重点是为奇数时你多加了1,在次数中你也要加一;
这个能过;
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int n,m,sum=0;
scanf("%d%d",&n,&m);
if(n>=m)
sum=n-m;
else
{
while((n-m)!=0)
{
if(m%2==0&&m>n) //偶数 用
{
m=m/2;sum++;
}
else if(n>=m)
{
sum=sum+n-m;break;
}
if(m%2!=0&&m>n) //奇数 用
{
m=(m+1)/2;sum=sum+2;
}
}
}
printf("%d\n",sum);
return 0;
}