[ZPG TEST 109] 兔子跳跃【构图】
兔子跳跃
(jumping.pas/c/cpp)
【问题描述】
兔子常常感到孤独,所以当他们决定出去走走,去见见他们的朋友,他们跳的很快。
Iris正走在一条无限长的直线道路上。这条道路上点的编号...,-3,-2,-1,0,1,2,3,...从西到东。Iris的家是在0点上,而她想要见的朋友在点1000000001。她是兔子当然只能通过移动跳跃前行,她有两个跳跃类型:小跳和大跳。当她在点x,通过一小跳,她可以移动到点(x + 2)或(x - 2)。通过一个大跳跃,她可以移动到点(x + largeJump)或点(x - largeJump)。
不幸的是,道路总是那么坑坑洼洼,洞的大小不一,有些还可能包含连续几个点,Iris不能跳到这些洞中。
Iris喜欢用小跳,因为这样更加的省力。请问到达1000000001所要使用的最少的大跳跃数量。如果不能达到这一点,输出-1。
注意,道路无限长,当然能跳到超过1000000001的点。
【输入】
输入文件名为jumping.in。
有多组测试数据:
第一行,包含一个整数Num,表示测试数据的个数。(1<=Num<=10)
每组测试数据,
第一行一个整数N,表示共有N个洞。1<=N<=25.
接下来一行N*2个整数,每个洞的两个端点编号,所有端点都是严格递增顺序给出。[1 and 1,000,000,000]。
最后一个整数largeJump[3 and
1,000,000,000]。
【输出】
输出文件jumping.out共Num行,
到达目标所需最少大跳跃的次数。无法到达输出-1
【输出输出样例】
|
jumping.in |
jumping.out |
|
5 1 1 2 3 1 1 2 4 1 2 3 3 4 2 17 21 19 12 187640193 564588696 564588907 605671187 605671278 755723729 755723774 755723880 755723920 795077851 795078039 945654724 945654815 475 |
1 -1 3 5 9 |
【说明】
第一组样例中
0
=> 3 -> 5 -> 7 -> ... -> 999999999 -> 1000000001
从0到3使用了一次大跳跃。
第二组样例中,她只能跳到偶数的位置,不可能到达目标。
第三组样例中,0 -> -2 => 1 => 4 =>
7 -> 9 -> 11 -> ... -> 999999999 -> 1000000001
乍一看以为是需要离散化的dp,可是这里的大跳跃步数不是定值,所以难以做到。
这一题其实可以构建图论模型!注意到小跳跃是没有代价的,而且小跳跃之后所在节点奇偶性不变。由于每个洞是不能进入的,所以可以把每段可以走的路作为节点,再把这个节点拆成两个点,其中一个表示这段能走的路的奇数点,另一个表示偶数点。然后枚举每对节点,如果可以从i节点大跳跃到j节点,则连边。最后求一次最短路就ok!由于是不加权的图,用bfs就可以了。
#include <cstdio>
#include <cstring> const int des = 1000000001; int T, n, lj, x[30], y[30], TT, tx1, ty1, tx2, ty2, lasty, idx;
int que[60], head_, tail, h, stp[60];
struct graph {
int head[60], to[3600], next[3600], lb;
void clear(void) {
memset(head, -1, sizeof head);
memset(next, -1, sizeof next);
lb = 0;
}
void ist(int aa, int ss) {
to[lb] = ss;
next[lb] = head[aa];
head[aa] = lb;
++lb;
}
} g; int main(void) {
freopen("jumping.in", "r", stdin);
freopen("jumping.out", "w", stdout);
scanf("%d", &TT);
while (TT--) {
memset(x, 0, sizeof x);
memset(y, 0, sizeof y);
memset(que, 0, sizeof que);
memset(stp, -1, sizeof stp);
head_ = tail = 0;
scanf("%d", &n);
lasty = -2147483637;
idx = 0;
for (int i = 0; i < n; ++i) {
scanf("%d%d", &tx1, &ty1);
if (tx1 != lasty + 1) {
x[idx] = lasty + 1;
y[idx] = tx1 - 1;
++idx;
}
lasty = ty1;
}
x[idx] = lasty + 1;
y[idx] = 2147483637;
T = idx << 1 | 1;
++idx;
scanf("%d", &lj);
if (lj & 1 ^ 1) {
puts("-1");
continue;
}
g.clear();
for (int i = 0; i < (idx << 1); i += 2) {
tx1 = x[i >> 1] + (x[i >> 1] & 1? 1: 0);
ty1 = y[i >> 1] - (y[i >> 1] & 1? 1: 0);
for (int j = 1; j < (idx << 1); j += 2) {
tx2 = x[j >> 1] + (x[j >> 1] & 1? 0: 1);
ty2 = y[j >> 1] - (y[j >> 1] & 1? 0: 1);
if (tx1 + lj <= ty2 && ty1 + lj >= tx2 || tx1 - lj <= ty2 && ty1 - lj >= tx2) {
g.ist(i, j);
}
}
}
for (int i = 1; i < (idx << 1); i += 2) {
tx1 = x[i >> 1] + (x[i >> 1] & 1? 0: 1);
ty1 = y[i >> 1] - (y[i >> 1] & 1? 0: 1);
for (int j = 0; j < (idx << 1); j += 2) {
tx2 = x[j >> 1] + (x[j >> 1] & 1? 1: 0);
ty2 = y[j >> 1] - (y[j >> 1] & 1? 1: 0);
if (tx1 + lj <= ty2 && ty1 + lj >= tx2 || tx1 - lj <= ty2 && ty1 - lj >= tx2) {
g.ist(i, j);
}
}
} que[tail++] = 0;
stp[0] = 0;
while (head_ != tail) {
h = que[head_++];
for (int j = g.head[h]; j != -1; j = g.next[j]) {
if (stp[g.to[j]] == -1) {
stp[g.to[j]] = stp[h] + 1;
que[tail++] = g.to[j];
}
}
}
printf("%d\n", stp[T]);
}
return 0;
}
[ZPG TEST 109] 兔子跳跃【构图】的更多相关文章
- 玩家福音:10款最佳Linux免费游戏
“我能在Linux平台上游戏吗?”这类疑问正困扰游戏玩家,那么答案就是“快去Linux平台吧!”.开源组织一直以来坚持不懈为Linux操作系统开发不同类型的游戏,在Linux平台下的游戏完全不亚于其他 ...
- 开源玩家福利:十大Linux免费游戏
假如当你考虑从Windows平台迁移至Linux平台时,“我能在Linux平台上游戏吗?”这类疑问正困扰着你,那么对此这有一个答案就是“快去Linux平台吧!”.感谢开源组织一直以来坚持不懈为Linu ...
- 【AGC006 C】Rabbit Exercise
题意 有 \(n\) 只兔子在数轴上,第 \(i\) 只兔子的初始坐标为整数 \(x_i\). 现在这些兔子会按照下面的规则做体操.每一轮体操都由 \(m\) 次跳跃组成:在第 \(j\) 次跳跃时, ...
- [ZPG TEST 117] 跑路【构图】
一看懵了,求一条路的长度whose二进制位中1的个数最小?什么鬼. 其实这种n这么小的图论题,应该往Floyd上想了.令f(p, i, j)为从i走长度为2^p长度的路能否到j,若能,则在一张新的图上 ...
- Java兔子问题
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? /** * @Title:Rabbit.java ...
- P4001 [BJOI2006]狼抓兔子(对偶图)
P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...
- 清北学堂 day6 兔子
---恢复内容开始--- [问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与 ...
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)
建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...
- Entity Framework 6 Recipes 2nd Edition(10-9)译 -> 在多对多关系中为插入和删除使用存储过程
10-9. 在多对多关系中为插入和删除使用存储过程 问题 想要在一个无载荷的多对多关系中使用存储过程(存储过程只影响关系的连接表) 解决方案 假设有一个多对多关系的作者( Author)表和书籍( B ...
随机推荐
- WebLogic"域"的概念
WebLogic Server中的域是逻辑上相关的一组 WebLogic Server 资源,可以作为一个单元进行管理.一个域中包含一台或多台 WebLogic Server,也可以包含 WebLog ...
- javascript 语法规范错误提示代码
“Missing semicolon.” : “缺少分号.”, “Use the function form of \”use strict\”.” : “使用标准化定义function.”, “Un ...
- PADs 元器件PCB建库
直接看图就好了,上图! 有几点需要记住的: 如果没有datasheet的情况下,与焊盘相比,阻焊大0.1mm,钢网小0.1mm.或者阻焊大0.05mm,钢网等大,具体要看引脚的间距. 焊盘太大,比如1 ...
- linux-shell脚本命令之awk
[ awk简单介绍: ] awk能够从一个文本中获取部分内容, 或者对这个文本进行排版, 使它按某种格式输出. [ awk工作流程: ] awk会把文件一行内容去到内存里, 然后对这行内容进行分段 ( ...
- QmlWinExtras
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zhengtianzuo06/article/details/78404961QtWinExtras是 ...
- accept()函数用来告诉Qt,事件处理函数“接收”了这个事件,不要再传递;ignore()函数则告诉Qt,事件处理函数“忽略”了这个事件,需要继续传递(看一下QWidget::mousePressEvent的实现,最为典型。如果希望忽略事件,只要调用父类的响应函数即可)
QEvent的accept()和ignore()一般不会用到,因为不如直接调用QWidget类的事件处理函数直接,而且作用是一样的,见下面的例子. 推荐直接调用QWidget的事件处理函数.而不是调用 ...
- HTTP协议 (一) HTTP协议详解
当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了We ...
- webstorm使用帮助(转自http://my.oschina.net/longteng2013/blog/138010),另外有部分内容摘自其它人博客
为了更高效的开发代码,这里列出了一些webstorm的快捷键和zencoding 发表于1 年 前(2013-06-17 00:19) 阅读(2101) | 评论(2) 11人收藏此文章, 我要收 ...
- 数据库sqlite3的使用-代码实例应用
一.使用代码的方式批量添加(导入)数据到数据库中 1.执行SQL语句在数据库中添加一条信息 插入一条数据的sql语句: 点击run执行语句之后,刷新数据 2.在ios项目中使用代码批量添加多行数据 ...
- Spring配置事务的五种方式
Java事务的类型有三种: JDBC事务. 可以将多个 SQL 语句结合到一个事务中.JDBC 事务的一个缺点是事务的范围局限于一个数据库连接.一个 JDBC 事务不能跨越多个数据库 JTA(Java ...