D:皮皮想拜师

皮皮想拜师

https://ac.nowcoder.com/acm/contest/6840/D

D:皮皮想拜师,其实这题就是一个简单的BFS。
首先分析一下复杂度:搜到答案就停止,也就是说最坏的情况就是O(n),n最大是1e5,是完全没有问题的。

按照BFS的思路,对任一移动可以到达的位置有n-1、n+1、2n三个,把他们加进队列,如果其中某一位置已经到进过队列,则跳过(BFS的性质,先进队列的元素的步数一定小于等于后进队列元素的步数)。然后就是菜鸡会踩的坑点————特判,若初始位置正好等于神仙的位置,则只经过0次(在这WA了两发一模一样的代码的我,那你为啥不直接让我把你送上去省得跳来跳去啊,,*,*
超暴力AC代码如下:

#include <bits/stdc++.h>
using namespace std;
int n,t,m;
int f[100010];
queue <int> q;
void bfs(){
    while(!q.empty()){
        t=q.front();
        if(t-1>=0&&!f[t-1]){
            if(t-1==m){
                cout<<f[t];
                return;
            }
            q.push(t-1);
            f[t-1]=f[t]+1;
        }
        if(t+1<=100000&&!f[t+1]){
            if(t+1==m){
                cout<<f[t];
                return;
            }
            q.push(t+1);
            f[t+1]=f[t]+1;
        }
        if(t*2<=100000&&!f[t*2]){
            if(t*2==m){
                cout<<f[t];
                return;
            }
            q.push(t*2);
            f[t*2]=f[t]+1;
        }
        q.pop();
    }
}
int main(){
    cin>>m>>n;
    if(n==m){
        cout<<"0";
        return 0;
    }
    q.push(n);
    f[n]=1;
    bfs();
    return 0;
}
全部评论

相关推荐

头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务