【手发】简单变化(后面有个手法)

题目如下:

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:
点个赞吧~
2 个赞

666

3 个赞