题目描述
输入两个整数n(0< n< 100001)和k(0< k< 100001),通过对n连续进行加1或减1或乘以2这3种操作,使得n最后结果正好等于k(同一种操作可以使用多次也可以不使用),要求最后输出最少的操作次数。
例如:n为5,k为17,通过减1、乘以2、乘以2、加1四次操作得到17,也就是5-1=4,4*2=8、8*2=16,16+1=17.
输入
输入两个整数n和k(n和k之间以一个空格隔开)
输出
输出最少的操作次数
样例输入
5 17
样例输出
4
思路:如果n>k,那么只能一直执行-1的操作,答案就是n-1。如果n<k,那么反过来考虑,变成k可以加减一或除二,能除二优先除二,当除二后比n小时,⽐较⼀下是除二再加好还是直接减好。
程序:
#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
int main(){
cin>>n>>k;
if(n>k)cout<<n-k;
else{
while(k>n){
if(k%2==0){
if(k/2>=n)k/=2;
else{
if(n-k/2+1<k-n)k/=2;
else k--;
}
}else k--;
ans++;
}
if(k<n)ans+=n-k;
cout<<ans;
}
return 0;
}