[openjudge6043]哆啦A梦的时光机
[openjudge6043]哆啦A梦的时光机
试题描述
哆啦A梦有一个神奇的道具:时光机。坐着它,大雄和他的伙伴们能穿越时空,回到过去或者去到未来。

有一天,大雄和他的伙伴们想穿越时空进行探险,可是时光机却出了一点故障,只能进行有限的时空穿越操作。大雄他们需要从现在出发,到达一个目标时间点进行探险,结束后再返回到现在,他们希望尽可能减少时光机的操作次数,你能帮助他们吗?
假设大雄和他的伙伴们出发的时间点(现在)为 \(S\)(\(0 < S < 1,000,000\)),希望到达的时间点(目标)为 \(T\)(\(0 < T < 1,000,000\)),已知时光机可以进行如下的时空穿越操作(\(X\) 为正整数):
可以从任意时刻 \(X\) 穿越到 \(X+1\) 或者 \(X-1\) 时刻
可以从任意时刻 \(X\) 穿越到 \(X*2\) 时刻
当 \(X\) 为偶数时,可以从 \(X\) 时刻穿越到 \(X/2\) 时刻
请问,大雄和他的伙伴们从 \(S\) 时刻出发,先到达 \(T\) 时刻,再回到 \(S\) 时刻最少需要多少次时空穿越操作?
输入
输入的第一个数是一个正整数N,表示测试数据一共有N组(0 < N < 20)。
之后有N行,每一行包含两个正整数S和T,表示出发和到达时间点。S≠T
输出
输出包括 \(N\) 行,每一行一个正整数,表示每组测试数据对应的最少时光机操作次数。
输入示例
2
5 17
4 8
输出示例
8
2
数据规模及约定
见“试题描述”和“输入”
题解
hash + 双向 BFS。
你需要相信这个题答案不会很大,搜到的状态数也存得下。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define rep(i, s, t) for(int i = (s); i <= (t); i++)
#define dwn(i, s, t) for(int i = (s); i >= (t); i--)
int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
#define maxn 1000010
#define HMOD 1000037
#define maxv 2147483647
#define LL long long
#define pii pair <int, int>
#define x first
#define y second
#define mp(x, y) make_pair(x, y)
struct Hash {
int ToT, head[HMOD], nxt[maxn], key[maxn];
pii val[maxn];
void init() {
ToT = 0;
memset(head, 0, sizeof(head));
return ;
}
pii Find(int x) {
int u = x % HMOD;
for(int e = head[u]; e; e = nxt[e]) if(key[e] == x) return val[e];
return mp(-233, -666);
}
bool Insert(int x, int v, int tp) {
if(Find(x).x >= 0) return 0;
int u = x % HMOD;
key[++ToT] = x; val[ToT] = mp(v, tp); nxt[ToT] = head[u]; head[u] = ToT;
return 1;
}
} h;
int Q[maxn], hd, tl;
void bfs(int s, int t) {
hd = tl = 0; Q[++tl] = s; Q[++tl] = t;
h.init();
h.Insert(s, 0, 1); h.Insert(t, 0, 2);
while(hd < tl) {
int u = Q[++hd];
pii now = h.Find(u);
if(((LL)u << 1) <= maxv) {
int v = u << 1;
bool ok = h.Insert(v, now.x + 1, now.y);
if(!ok && h.Find(v).y != now.y) return (void)printf("%d\n", now.x + 1 + h.Find(v).x << 1);
if(ok) Q[++tl] = v;
}
if(!(u & 1) && u > 0) {
int v = u >> 1;
bool ok = h.Insert(v, now.x + 1, now.y);
if(!ok && h.Find(v).y != now.y) return (void)printf("%d\n", now.x + 1 + h.Find(v).x << 1);
if(ok) Q[++tl] = v;
}
if((LL)u + 1 <= maxv) {
int v = u + 1;
bool ok = h.Insert(v, now.x + 1, now.y);
if(!ok && h.Find(v).y != now.y) return (void)printf("%d\n", now.x + 1 + h.Find(v).x << 1);
if(ok) Q[++tl] = v;
}
if(u > 0) {
int v = u - 1;
bool ok = h.Insert(v, now.x + 1, now.y);
if(!ok && h.Find(v).y != now.y) return (void)printf("%d\n", now.x + 1 + h.Find(v).x << 1);
if(ok) Q[++tl] = v;
}
}
return ;
}
int main() {
int T = read();
while(T--) {
int a = read(), b = read();
bfs(a, b);
}
return 0;
}
[openjudge6043]哆啦A梦的时光机的更多相关文章
- [openjudge-搜索]哆啦A梦的时光机
题目描述 描述 哆啦A梦有一个神奇的道具:时光机.坐着它,大雄和他的伙伴们能穿越时空,回到过去或者去到未来. 有一天,大雄和他的伙伴们想穿越时空进行探险,可是时光机却出了一点故障,只能进行有限的时空穿 ...
- [css]我要用css画幅画(七) - 哆啦A梦
接着之前的[css]我要用css画幅画(六),今天画的有所不同,画的是哆啦A梦,我们小时候对他的称呼其实是小叮当机器猫. (PS:这次我要做的事情,很多人已经做过,这并不是什么创新,我只是在学习并记录 ...
- 创建【哆啦A梦】风格字体
学习canvas,为作画.对于一个毫无逻辑思维的人简直遭罪啊~想象坐标坐标坐标啊- - 好啦言归正传,基于本月16号,在春熙路IFS展出120只哆啦a梦,以及canvas的作用,在此介绍一种PS的美化 ...
- 哆啦A梦 canvas
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 哆啦A梦连连看游戏源码完整版
这个源码是哆啦A梦连连看游戏源码完整版,也是安卓教程网android.662p.com分享过来的,哆啦A梦大家一定再熟悉不过了,这次登场的角色你能认出全部吗?赶紧把相同的小图标全部消除吧,一起体验下! ...
- 纯css画哆啦A梦
今天有点无聊,照着网上的图写了个哆啦A梦,无技术可言,纯考耐心. <!doctype html> <html lang="en"> <head> ...
- 大雄和哆啦A梦
题目:大雄和哆啦A梦题目介绍:这个图片名称有点奇怪?! 1,打开链接会看到大雄和哆啦A梦的照片,把它下载下来.就是下面这个图片. 2,用wireshark打开,会看到最后面出现 rar ,还有flag ...
- 哆啦A梦欺骗了你!浏览器CSS3测试遭质疑
首先,说明,此处只是告诫各位参与CSS3.0学习使用或者将要使用或者学习CSS3.0的朋友,不要完全信任网络资源,依靠网络资源,我们需要利用网络资源的方便和可取的部分,结合自己的理解,学好,理解好! ...
- CSS源码之纯css3制作的哆啦a梦图片
本文章向大家介绍一个纯css3制作的哆啦a梦图像,主要巧妙的使用了css3的border-radius属性,需要的朋友介意参考一下本文章的源码. 效果图: 源码 <!doctype html&g ...
随机推荐
- 【Python全栈-CSS】background背景
background背景 一.背景图片 background-image: url("img/num.png"); background-position-x: -200px ; ...
- 题解 P1137 【旅行计划】
传送门 很显然,每个点的答案是它所有前驱节点的答案加1,即f[i]=max(f[i],f[j]+1); 考虑空间复杂度用邻接表存图,在拓扑排序同时DP就好了 #include<iostream& ...
- java基础面试题:switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
package com.swift; public class Switch_Test { public static void main(String[] args) { /* * switch语句 ...
- 洛谷P2468 [SDOI2010]粟粟的书架(二分答案 前缀和 主席树)
题意 题目链接 给出一个矩形,每个点都有一些值,每次询问一个子矩阵最少需要拿几个数才能构成给出的值 Sol 这题是真坑啊.. 首先出题人强行把两个题拼到了一起, 对于前$50 \%$的数据,考虑二分答 ...
- Mysql关闭和修改密码
数据库的关闭方法: 1.优雅的关闭数据库的方法:mysqladmin -uroot -p123456 shutdown 2.脚本关闭:/etc/init.d/mysqld stop 3.使用kill信 ...
- JZOJ 4421. aplusb
4421. aplusb Time Limits: 1000 ms Memory Limits: 524288 KB Detailed Limits Goto ProblemSet Descr ...
- 关于web.xml配置中的<url-pattern>
标签<url-pattern> <url-pattern>是我们用Servlet做Web项目时需要经常配置的标签,例: <servlet><servlet-n ...
- B1013 数素数(20分)
B1013 数素数(20分) 令 \(P_i\)表示第 i 个素数.现任给两个正整数 \(M≤N≤10^4\),请输出 \(P_M\)到 \(P_N\)的所有素数. 输入格式: 输入在一行中给出 M ...
- 9、python中的控制流
学习完python的基础与数据后,我们就可以编写一些简单的命令了.但这时我们发现,目前位置写出来的程序都是自上而下顺序地执行的.要想程序改变这种自上而下的流程多一点变化,我们就要学习三种程序中的语句. ...
- Java模拟音乐播放器 暂停与重新播放——线程如何控制另外一个线程的状态
package com.example.Thread; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEve ...