分析:一开始我觉得肯定dp,这不是很明显?
然而没想到怎么做,因为dp不知道按什么顺序。。反正这题绝逼有dp做法,等我想出来再写。。
大部分人写的都是bfs(smg),这根本一点都不明显好吗。唉,,反正bfs的相当暴力,,直接从起点开始跑,然后左右和*2加进队列,,知道能跑到终点为止。。注意左边界为0,右边界为max(n,k)+1..
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
int n,m;
int l,r;
queue<int>q;
const int N=1e5+5;
int f[N];
int main()
{
scanf("%d%d",&n,&m);
int mx=max(n,m)+1;
memset(f,-1,sizeof(f));
q.push(n);
f[n]=0;
while (!q.empty())
{
int x=q.front();
q.pop();
if (x+1<=mx&&f[x+1]==-1)
{
q.push(x+1);
f[x+1]=f[x]+1;
if (x+1==m)break;
}
if (x-1>=0&&f[x-1]==-1)
{
q.push(x-1);
f[x-1]=f[x]+1;
if (x-1==m)break;
}
if (x*2<=mx&&f[x*2]==-1)
{
q.push(x*2);
f[x*2]=f[x]+1;
if (x*2==m)break;
}
}
printf("%d\n",f[m]);
}