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. CSS3高级

    一.学习目标 二.box-sizing属性 语法:box-sizing: content-box|border-box|inherit box-sizing属性的用法: box-sizing属性可以为 ...

  2. CoreCLR文档翻译 - GC的设计

    此文档来源于CoreCLR的BOTR(The Book of the Runtime), 点击打开原文 一切著作权归微软公司所有 GC的设计 作者: Maoni Stephens (@maoni0) ...

  3. action = "#" 是什么意思 在HTML语言中

    action = "#" 是form标签的属性,代表提交数据到本页,如:// 提交数据到a.aspx页面<form action="a.aspx"> ...

  4. Virtualbox中的Linux:未能加载虚拟光驱 VBoxsGuestAdditions.iso到虚拟电脑

    安装增强功能 出现了 这个问题,需要弹出光盘,再次安装.

  5. Python批量重命名

    某无聊的下午的一个小需求 import os dirPath = r'' #路径 format = r'' #后缀 name = 0 for file in os.listdir(dirPath): ...

  6. php学习笔记——CSS缓存问题

    PHP也没学多久,在工作中遇到了一个问题,先来记录一下. 问题描述: 同一项目里面的不同模块对应了不同的网站,但是两个网站用的文件名以是同一规范的,最后导致了两个网站css文件同名,在打开了网站A后去 ...

  7. Java 并发 线程同步

    Java 并发 线程同步 @author ixenos 同步 1.异步线程本身包含了执行时需要的数据和方法,不需要外部提供的资源和方法,在执行时也不关心与其并发执行的其他线程的状态和行为 2.然而,大 ...

  8. centos7 install rvm

    不管其他,先按要求更新一下包 yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel li ...

  9. iOS中的布局

    1.UIView 有三个比较重要的布局属性: frame , bounds 和 center , CALayer 对应地叫做 frame , bounds 和 position .为了能清楚区分,图层 ...

  10. java操作mongodb——查询数据

    通过find方法查询集合中的文档信息 -------------------------------------------------------- find() 查询所有文档信息,返回FindIt ...