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. WPF星空效果

    效果 前阵子看到ay的蜘蛛网效果和知乎的登录页背景,觉得效果很酷.自己也想写一个.于是写着写着就变成这样了.少女梦幻的赶脚有木有.我这有着一颗少女心的抠脚大汉 实现思路 分为两个部分: 1.星星无休止 ...

  2. 在VS中配置并测试opencv

    什么是opencv? opencv是一个计算机视觉库.它目前有两个分支2.4.X和3.X,2.4.X版本是经典版本,网上的教程资源大多是关于它的,所以推荐使用2.4.X. 它能帮我做什么? 这意味着你 ...

  3. [ios2] CABasicAnimation【转】

    caanimation 整理了解  http://geeklu.com/2012/09/animation-in-ios/ 几个可以用来实现热门APP应用PATH中menu效果的几个方法 +(CABa ...

  4. JAVA基础之内部类

    JAVA基础之内部类 2017-01-13 1.java中的内部类都有什么?! 成员内部类 局部内部类 匿名内部类 静态内部类 2.内部类详解 •成员内部类 在一个类的内部再创建一个类,成为内部类 1 ...

  5. Robot Framework使用技巧

    1.变量的使用 变量可以在命令行中设置,个别变量设置使用--variable (-v)选项,变量文件的选择使用--variablefile (-V)选项.通过命令行设置的变量是全局变量,对其所有执行的 ...

  6. Docker集群实验环境布署--swarm【4 管理组件--manager】

    主机分配如下,支持双活,中断其中1台,primary会通过consul自动重新选举   10.40.100.141 docker-manager0.venic.com 10.40.100.142 do ...

  7. [Q]打印机页边距设置

    问题描述:当您在使用CAD批量打图精灵默认设置打印图纸(使用pdfFactory虚拟打印机),可能会发现打印出的图纸页边距比您手工打印(使用Adobe或系统打印机)的要偏大. Adobe虚拟打印机打印 ...

  8. Mysql 常用命令和注意事项

    1. 连接mysql数据库 如果配置了环境变量可以直接运行,如果没有配置环境变量需要在安装目录...\bin下运行, cmd -> mysql -u root -p,然后输入密码: 或者可以运行 ...

  9. java http url post json

    import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import ja ...

  10. ubuntu 安装wxpython2.8

    echo "deb http://archive.ubuntu.com/ubuntu wily main universe" | sudo tee /etc/apt/sources ...