问题 D: 数字变换(dfs)
题目描述
给定一个数N (O≤N≤100000),变成另一个数K(O≤K≤100000),允许的操作是乘以2,或者加减1,问最少要几步才能完成?
输入
仅有两个整数 N 和 K。
输出
一个整数,表示需要的最少步数。
样例输入 Copy
5 17
样例输出 Copy
4
dfs,不过要注意0的时候
#pragma GCC optimize(2) #include<bits/stdc++.h> #include <math.h> using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int maxn=1e5+100; int n,k; int dfs(int n,int k){ if(n>=k){ return n-k; } if(k%2==0){ return min(k-n,dfs(n,k/2)+1); } else{ return min(dfs(n,k+1),dfs(n,k-1))+1; } } void inint(){ cin>>n>>k; } int main(){ inint(); int ans; if(n==0){ n=1; ans=1; } else{ ans=0; } int p=ans+dfs(n,k); cout<<p; }