bzoj1646

来源:互联网 发布:java可以使用html5吗 编辑:程序博客网 时间:2024/05/18 19:41

分析:一开始我觉得肯定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]);}
0 0