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; }