您的位置:首页 > 其它

从n到m,有-1和*2两种操作。问最少走几步

2016-03-18 23:20 441 查看
从n到m,有-1和*2两种操作。问最少走几步。

这题必须从m来逆向考虑。

#include <>bits/stdc++.h>
using namespace std;
int main(){
int count =0;
int m,n;
cin>>n>>m;
while(n < m){
if(m%2)
m++;
else
m/=2;
count++;
}
cout<<count+n-m<<endl;
}

另一题:从n到m,有-1和+1和*2三种操作。问最少走几步。

后来想了想记忆化搜索真的是行不通的,会重复取状态。

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <cstdio>
#include <map>
#include <set>
#include<queue>
using namespace std;
int vis[200005];
queue<pair<int,int> > q;
int main(){
int n,m;
cin>>n>>m;
int s=0;
q.push(make_pair(n,0));
while(!q.empty()){
int fr=q.front().first;
int p=q.front().second;
q.pop();
if(fr>200000||fr<0) continue;
if(vis[fr]==1) continue;
vis[fr]=1;
if(fr==m){
s=p;
break;
}
q.push(make_pair(fr-1,p+1));
q.push(make_pair(fr+1,p+1));
q.push(make_pair(fr*2,p+1));
}
cout<<s<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: