10676 涂鸦跳跃(sort)
10676 涂鸦跳跃
该题有题解
时间限制:1000MS 内存限制:65535K
提交次数:240 通过次数:19
题型: 编程题 语言: G++;GCC
Description
你玩过曾经风靡一时的手机游戏涂鸦跳跃吗?

这是个很简单的小游戏,我们的主角弹簧小怪物会不知疲倦地往上跳,而我们需要做的就是控制他的方向,跳得越高得分也越高。
有一天,Sirius突然想到一个问题,假如给定一个起始平台和终止平台,那么弹簧小怪物是否能够借助一系列平台从起始平台跳到终止平台呢?
我们假定屏幕的左下角是直角坐标系的原点(0,0),往右则x值增大,往上则y值增大。屏幕的最右端的坐标是x = M。
每个平台表示为[x1, x2, y],分别为平台的左端点x值、右端点x值以及高度,当然平台是平行于x轴的。弹簧小怪物在
竖直方向上最多可以跳h,在水平方向上最多可以跳w,竖直跳和水平跳是可以同时进行的。由于游戏画面的移动,小怪物
是不能跳到比它当前所在平台低的平台的,但是可以跳到当前所在平台的任何位置。小怪物可以穿越屏幕左边到达右侧,
也可以穿越屏幕右边到达左侧,当然穿越跳也要受到水平弹跳力w的限制。为了简化题目,我们假定只要在小怪物弹跳能力
范围内的平台都是可以到达的,即使一个平台恰好挡在另一个平台的上方!并且,我们不考虑平台的厚度,小怪物看作一个点,
不同平台不会有重叠部分。到达终止平台的任何位置,我们都认为它已经到达。
输入格式
第一行只有一个正整数T,表示题目共有T组数据
接下来是T组数据。每组数据的第一行是4个正整数n、M、w、h,分别表示平台个数、屏幕最右端的x坐标、小怪物的水平跳跃能力、
小怪物的竖直跳跃能力,2 <= n <= 1000,0 < w < M <= 10000,0 < h < 1000。接下来n行,每一行有
三个正整数x1 x2 y(M >= x2 > x1 >= 0, 10000 >= y >= 0),分别表示平台的左端点x值、右端点x值以及高度。
在这n行中,第一行表示的是起始平台,最后一行表示的是终止平台,平台的高度不一定按顺序排列。
输出格式
如果小怪物能从起始平台到达终止平台,输出yes;否则输出no。
输入样例
3 5 100 20 20
1 5 0
25 81 20
1 4 40
5 6 19
1 3 50 2 100 20 20
0 5 0
80 100 100 3 100 20 20
0 5 0
3 7 3
8 14 10
输出样例
yes
no
yes
提示
当穿越的时候,我们认为屏幕最左侧x=0和屏幕最右侧x=M是等价的。比如样例输入1,第1个平台可以跳到第2个和第4个,
第2个平台可以跳到第3个(穿越跳,100-81+1-0=20<=w=20),第3个可以跳到第5个,第4个可以跳到第2个。故答案是yes。
来源
by sirius
作者
admin
题解
题意大概是给你n条线段,有个物体可以往上和左右进行跳跃,并且限制了跳跃的范围,问能否从起始线段跳到终止线段。
大概题解写在代码注释上:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define X first
#define Y second
#define clr(u,v); memset(u,v,sizeof(u));
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=;
const int INF=0x3f3f3f3f;
struct node {
int x,y,high,flag,index;
//x和y分别代表线段的左右端点坐标,high代表线段高度,flag表示这条线段是否能到达,index代表线段原来的下标
bool operator < (const node &a) const {
return this->high<a.high;
}
}N[maxn];
int n,m,w,h; //判断线段j能否到达线段i
bool ok(int i,int j) {
if (N[j].y+w >= m) {
if (N[i].x >= N[j].x) return ;
else if (N[j].y+w-m >= N[i].x) return ;
} else {
if (N[j].y+w >= N[i].x) return ;
}
if (N[j].x-w<) {
if (N[i].x <= N[j].x) return ;
else if (N[j].x-w+m <= N[i].y) return ;
} else {
if (N[j].x-w <= N[i].y) return ;
}
return ;
}
int main() {
int T;
scanf("%d",&T);
while (T--) {
scanf("%d%d%d%d",&n,&m,&w,&h);
for (int i=;i<n;++i) {
scanf("%d%d%d",&N[i].x,&N[i].y,&N[i].high);
N[i].index=i,N[i].flag=;
}
N[].flag=;//起始边可以到达
sort(N,N+n);
//暴力枚举高度比当前线段高度低的边,且该边可以被到达,判断当前线段能否被到达
for (int i=;i<n;i++) {
for (int j=;j<i;++j) {
if (N[j].flag && N[i].high-N[j].high<=h && ok(i,j)) {
N[i].flag=;//如果能到达,进行标记
break ;
}
}
}
//看下标为n-1的边(排序前的最后一条线段)能否被到达,可以的话输出yes,否则输出no
for (int i=;i<n;i++) {
if (N[i].index == n-) {
if (N[i].flag) puts("yes");
else puts("no");
break ;
}
}
}
return ;
}
/*
3
2 100 1 100
80 99 100
0 5 0 2 100 1 100
80 99 0
0 5 100 2 100 1 100
0 5 0
80 99 100
*/
/*
no
yes
yes
*/
10676 涂鸦跳跃(sort)的更多相关文章
- [Unity游戏开发]向量在游戏开发中的应用(一)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50810102 向量在游戏开发中是非常实用的,我们在学校学完向量的知识后,只 ...
- 一 手游开发工具cocos2d-x editor初识
可学习的demo: 7个实战项目 flappybird(飞扬小鸟).popstar(消灭星星).fruitninja(水果忍者).2048(数度消除). moonwarriors(月亮战神).frui ...
- 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)
跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...
- AC日记——有趣的跳跃 openjudge 1.6 07
07:有趣的跳跃 总时间限制: 1000ms 内存限制: 65536kB 描述 一个长度为n(n>0)的序列中存在“有趣的跳跃”当前仅当相邻元素的差的绝对值经过排序后正好是从1到(n-1). ...
- UOJ #138. 【UER #3】开学前的涂鸦
Description 红包是一个有艺术细胞的男孩子. 红包由于NOI惨挂心情不好,暑假作业又多,于是他开始在作业本上涂鸦. 一开始,他在纸上画了一棵 n 个节点的树.但是他觉得这样的画太简单了,体现 ...
- 【线性基 集合hash】uoj#138. 【UER #3】开学前的涂鸦
还需要加强分析题目特殊性质,设计对应特殊算法,少想多写大力dfs剪枝不要管MLETLE直接上的能力 红包是一个有艺术细胞的男孩子. 红包由于NOI惨挂心情不好,暑假作业又多,于是他开始在作业本上涂鸦. ...
- 连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)
连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort) 1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换 ...
- SED总结, mac上要加备份文件名,sort命令和对中文的处理
使用sed批量改文件名 Sed批量去拓展名 |- dev.gb.conll06.raw |- test.gb.conll06.raw |- train.gb.conll06.raw 想要去掉其中的后缀 ...
- 多种方法实现实现全排列 + sort调用标准函数库函数的简述
全排列:所有不同顺序的元素组组成的一个集合.这里使用使用递归实现全排列. 使用递归算算法呢,首先我们先找一下结束的条件:我们要对一组元素(这里使用数字举例)实现全排列,临界条件就是递归到只有一个元素的 ...
随机推荐
- IFE-20 笔记
将字符串按符号分割成数组 var str = 'aa,43,rt,55'; var arr = str.split(/[^0-9a-zA-Z\u4e00-\u9fa5]+/) //arr = [aa ...
- Eclipse 中,web项目在Tomcat运行时填写不了Server name
最近开发项目,从MyEclipse中导入项目到Eclipse中,那些WEB属性都在,可就是不能在Tomcat上运行.纠结一番,最后发现是这个问题: WEB的版本问题. 具体问题看下图: 解决方案: W ...
- 日志快速筛选 之 linux命令grep|uniq|wc|awk
以前我个人的观念是,在线上运行的东西尽量不要记什么流水日志. 但是后来我变了,发现在线上记日志是一个绝对有必要的东西,尤其是在当下很流行的微服务的推动下,没有日志的帮助,犹如一个睁眼瞎,排查问题基本靠 ...
- bzoj2301: [HAOI2011]Problem b懵逼乌斯反演
属于结果的和好求但是结果不好求的题 (轻易能得到以k的倍数为最大公约数的对数,但是不好直接求k) 所以一波反演结束 其实反演的时候完全没有反演的感觉,就是不停地恒等变形 算是懵逼乌斯反演最简单的例题 ...
- Python第一天——入门Python(3)列表
列表,也是一种序列类型. 如何定义列表? 用" [ ] "(中括号进行定义) 列表的索引操作 例如 # hobby_list=['basketball','football','p ...
- 批处理+组策略 实现规定时间段无法开机and定时关机
某爱熬夜的人对付自己的东西 1.shutdown命令 shutdown -a #取消现有的shutdown计划 shutdown -s -t [time] #设定时间关机 shutdown -r -t ...
- IntelliJ IDEA新建JAVA WEB项目(转载)
IntelliJ IDEA是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.各类版本控制工具(git.svn ...
- 启动web项目,报内存不足错误的解决方法
Initialization of bean failed; nested exception is java.lang.OutOfMemoryError: Java heap space 原因: 在 ...
- aop为系统添加操作日志,注入或配置声明的方式来实现
最近做项目实现操作记录添加日志,由于aop这两种实现方式各有优缺点,所以都实现了一下以后根据具体业务选择. 1实现方式一注入: 1.1首先在xml中开启aop注入,需要引入的包此处省略,可百度自己查找 ...
- Sublime Text3下如何快速搭建开发环境
安装好Sublime Text3之后,简单几步就可以搭建一个好用的开发环境. sublime的设置包括自定义设置以及插件系统. 打开菜单Preferences -> Settings,编辑自定义 ...