按钮

这是一个关于数学策略的问题,描述了一个设备,通过红色按钮将数字乘以2,蓝色按钮将数字减去1。目标是从数字n到达m,求解最小的操作次数。给定两个正整数n和m,需要找到从n到m的最少按钮按下次数。例如,从n=2到达m=3需要先按蓝色按钮再按红色按钮,共2次。当n<m且m为偶数时,可以先除以2直至m小于n,然后再进行加减操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vasya 发现了一个奇怪的设备。在设备的前面板上,有一个红色按钮、一个蓝色按钮和一个显示了某个正整数的屏幕。在按下红色按钮之后,设备将显示的数字乘以 2。在按下蓝色按钮之后,设备将显示的数字减去 1。如果在某时刻,数字不再是正数,则设备终止运行。显示屏幕可以显示任意大的数字。初始状态下,显示屏幕显示了数字 n

Bob 想要在显示屏幕上得到数字 m 。为了获得这个结果,他最小需要按下多少次按钮?

输入

输入的第一行 (也是唯一的一行),包含了两个不同的整数 nm (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;
}		

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值