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


京公网安备 11010502036488号