题目如下:
4. 简单变化
题目ID:9316必做题100分
最新提交:
Accepted
100 分
历史最高:
Accepted
100 分
时间限制: 1000ms
空间限制: 262144kB
题目描述
时间:1s 空间:256M
题目描述:
小信有两个数 𝑥x 与 𝑦y。
小信可以对 𝑥x 进行 33 种 操作:
1.让 𝑥x 等于 𝑥+1x+1
2.让 𝑥x 等于 𝑥−1x−1
3.让 𝑥x 等于 2⋅𝑥2⋅x
小信想知道把 𝑥x 变成 𝑦y 至少需要操作多少次。
输入格式:
第一行包含一个整数 𝑇T,表示 𝑇T 组测试数据。
对于每一组测试数据:
第一行包含两个整数 𝑥x, 𝑦y。
输出格式:
对于每一组测试数据,输出一个整数表示答案。
样例1输入:
1 5 17
样例1输出:
4
约定与提示:
对于100%的数据,1≤𝑡≤101≤t≤10, 1≤𝑥,𝑦≤1051≤x,y≤105
这题比较简单,但是我没抢到首发,所以我就用手发了~~~
想象一个可爱的一维数组(其实有T个),有两个点叫x,y
x的下标有三种奇奇怪怪的操作,+1,-1和*2
到这里就能看出来是BFS了,也没啥好说的
你以为这就完了吗?
才怪,这个为了不TLE,所以我们经过的数不需要再遍历了,搞一个bool的存在不存在数组
void bfs(){
queue<pair<long long,int>> q;
q.push({x,0});
vis[x]=1;
while(!q.empty()){
long long tx=q.front().first;
int ty=q.front().second;
q.pop();
if(tx==y){
cout<<ty<<endl;
return;
}
if(tx+1<y*2){
if(!vis[tx+1]){
q.push({tx+1,ty+1});
vis[tx+1]=true;
}
}
if(tx-1>1)
if(!vis[tx-1]){
q.push({tx-1,ty+1});
vis[tx-1]=true;
}
if(tx*2<y*3){
if(!vis[tx*2]){
q.push({tx*2,ty+1});
vis[tx*2]=true;
}
}
}
}
``` :nauseated_face:
点个赞吧~