A - 按钮
Vasya 发现了一个奇怪的设备。在设备的前面板上,有一个红色按钮、一个蓝色按钮和一个显示了某个正整数的屏幕。在按下红色按钮之后,设备将显示的数字乘以 2。在按下蓝色按钮之后,设备将显示的数字减去 1。如果在某时刻,数字不再是正数,则设备终止运行。显示屏幕可以显示任意大的数字。初始状态下,显示屏幕显示了数字 n 。
Bob 想要在显示屏幕上得到数字 m 。为了获得这个结果,他最小需要按下多少次按钮?
输入输入的第一行 (也是唯一的一行),包含了两个不同的整数 n 和 m (1 ≤ n, m ≤ 104),以空格间隔。
打印仅有的一个数字 — 为了从数字 n 得到数字 m,必须最少按下多少次按钮。
输入
4 6
输出
2
输入
10 1
输出
9
题解 : 进行一个很裸的bfs就可以了
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
int n,m;
struct fun{
long long a;
long long s;
};
int b[1000000];
queue<fun>qq;
long long bfs(int v){
memset(b,0,sizeof(b));
fun t;
t.a=v;
t.s=0;
qq.push(t);
long long p;
while(!qq.empty()){
fun g=qq.front();
if(g.a==m){
return g.s;
}
qq.pop();
for(int i=0;i<2;i++){
if(i==0){
p=g.a-1;
}
if(i==1){
p=g.a*2;
}
if(b[p]==0&&p>0&&p<=2*m){
t.a=p;
t.s=g.s+1;
b[p]=1;
qq.push(t);
}
}
}
}
int main(){
scanf("%d %d",&n,&m);
if(n>m){
printf("%d\n",n-m);
return 0;
}
while(!qq.empty()){
qq.pop();
}
long long h=0;
// while(m/2>n){
// h++;
// n*=2;
// }
// h-=1;
// n/=2;
// printf("%d\n",n);
h+=bfs(n);
printf("%lld\n",h);
return 0;
}