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)的更多相关文章

  1. [Unity游戏开发]向量在游戏开发中的应用(一)

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50810102 向量在游戏开发中是非常实用的,我们在学校学完向量的知识后,只 ...

  2. 一 手游开发工具cocos2d-x editor初识

    可学习的demo: 7个实战项目 flappybird(飞扬小鸟).popstar(消灭星星).fruitninja(水果忍者).2048(数度消除). moonwarriors(月亮战神).frui ...

  3. 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)

    跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...

  4. AC日记——有趣的跳跃 openjudge 1.6 07

    07:有趣的跳跃 总时间限制:  1000ms 内存限制:  65536kB 描述 一个长度为n(n>0)的序列中存在“有趣的跳跃”当前仅当相邻元素的差的绝对值经过排序后正好是从1到(n-1). ...

  5. UOJ #138. 【UER #3】开学前的涂鸦

    Description 红包是一个有艺术细胞的男孩子. 红包由于NOI惨挂心情不好,暑假作业又多,于是他开始在作业本上涂鸦. 一开始,他在纸上画了一棵 n 个节点的树.但是他觉得这样的画太简单了,体现 ...

  6. 【线性基 集合hash】uoj#138. 【UER #3】开学前的涂鸦

    还需要加强分析题目特殊性质,设计对应特殊算法,少想多写大力dfs剪枝不要管MLETLE直接上的能力 红包是一个有艺术细胞的男孩子. 红包由于NOI惨挂心情不好,暑假作业又多,于是他开始在作业本上涂鸦. ...

  7. 连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)

    连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort) 1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换 ...

  8. SED总结, mac上要加备份文件名,sort命令和对中文的处理

    使用sed批量改文件名 Sed批量去拓展名 |- dev.gb.conll06.raw |- test.gb.conll06.raw |- train.gb.conll06.raw 想要去掉其中的后缀 ...

  9. 多种方法实现实现全排列 + sort调用标准函数库函数的简述

    全排列:所有不同顺序的元素组组成的一个集合.这里使用使用递归实现全排列. 使用递归算算法呢,首先我们先找一下结束的条件:我们要对一组元素(这里使用数字举例)实现全排列,临界条件就是递归到只有一个元素的 ...

随机推荐

  1. 使用pentaho工具将数据库数据导入导出为Excel

    写在前面:本篇博客讲述的是如何使用pentaho工具快速的将数据库数据导出为Excel文件,以及如何将Excel文件数据导入数据库. 补充:使用此工具并不需要任何一句代码并能快速便捷解决实际问题,此工 ...

  2. JS —— 数组与字符串方法

    数组 1. 基本方法  1)Array.prototype.unshift(item1,item2,item3...) 描述: 在数组的前面添加元素,一次可以传入多个参数. 注意:元素会根据当前传入的 ...

  3. office全系列激活脚本-改良版

    @ECHO OFFTITLE office 全版本系统激活@echo offfor /l %%a in (8,1,16) do (for /f "tokens=*" %%i in ...

  4. 驱动09.nand flash

    1 nand flash的操作 目的:读地址A的数据,把数据B写到地址A. 问1. 原理图上NAND FLASH和S3C2440之间只有数据线,怎么传输地址?答1.在DATA0-DATA7上既传输数据 ...

  5. Python3 操作Excel--openpyxl

    操作Excel文件建议使用openpyxl 兼容office2016 打开excel文件,获取工作表 import openpyxl wb=openpyxl.load_workbook('ttt.xl ...

  6. js实现购买数量加减效果

    写在前面:当我们需要在多个页面都有操作数量的需求时的一种解决方案 结构: js代码: <script type="text/javascript"> function ...

  7. 关于jquery 1.9以上多次点击checkbox无法选择的

    在jquery1.9之前,我们对于一个checkbox对象来进行重复选择或者取消, 我们可以使用这个方法$().attr('checked',checked);//选中 $().removeAttr( ...

  8. css技巧总结

    本文旨在记录css中比较特殊的属性的用法,先按项目的时间顺记录,以后再整理. a,input,button,select,textarea{ outline:none; -webkit-tap-hig ...

  9. 在2002年的老电脑上安装Debian

    在2002年自己花了家里八千多元买了一台联想昭笔记本电脑.配置是PIII 750 Hz, 128 MB内存(后来升级到了320 MB).那个时候大学里买笔记本电脑的人还不多,宿舍里的同学大都攒的台式机 ...

  10. 开学&东大一周游记

    明天就要离开生活但并没有学到多少东西的东大了,不舍,这是真的,因为真的是没学到多少就要走了.但是终归是有收获的,比如感受到了舍长这样的大牛的学习态度,东大的浴池真的很棒,我很感激吉大的伙食诸如此类.感 ...