bzoj1646

    xiaoxiao2021-03-25  82

    分析:一开始我觉得肯定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]); }
    转载请注明原文地址: https://ju.6miu.com/read-13640.html

    最新回复(0)