L3-012 水果忍者 (30 分)
2010年风靡全球的“水果忍者”游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以完成游戏规定的任务。如果玩家可以一刀砍下画面当中一连串的水果,则会有额外的奖励,如图1所示。
图 1
现在假如你是“水果忍者”游戏的玩家,你要做的一件事情就是,将画面当中的水果一刀砍下。这个问题看上去有些复杂,让我们把问题简化一些。我们将游戏世界想象成一个二维的平面。游戏当中的每个水果被简化成一条一条的垂直于水平线的竖直线段。而一刀砍下我们也仅考虑成能否找到一条直线,使之可以穿过所有代表水果的线段。
图 2
如图2所示,其中绿色的垂直线段表示的就是一个一个的水果;灰色的虚线即表示穿过所有线段的某一条直线。可以从上图当中看出,对于这样一组线段的排列,我们是可以找到一刀切开所有水果的方案的。
另外,我们约定,如果某条直线恰好穿过了线段的端点也表示它砍中了这个线段所表示的水果。假如你是这样一个功能的开发者,你要如何来找到一条穿过它们的直线呢?
输入格式:
输入在第一行给出一个正整数N(≤),表示水果的个数。随后N行,每行给出三个整数x、y1、y2,其间以空格分隔,表示一条端点为(和(的水果,其中y1>y2。注意:给出的水果输入集合一定存在一条可以将其全部穿过的直线,不需考虑不存在的情况。坐标为区间 [ 内的整数。
输出格式:
在一行中输出穿过所有线段的直线上具有整数坐标的任意两点(和(,格式为 y1。注意:本题答案不唯一,由特殊裁判程序判定,但一定存在四个坐标全是整数的解。
输入样例:
5
-30 -52 -84
38 22 -49
-99 -22 -99
48 59 -18
-36 -50 -72
输出样例:
-99 -99 -30 -52
题意:给出一些平行于y轴的线段,要求找到一条直线可以穿过(经过端点也可)所有线段,输出直线上的两个点,要求都是整数。
注意:如果只有一条线段,自己本身就是答案,可能存在多条直线重合,只需要记录y最小的上端点和y最大的下端点。
方法:根据求凸包的原理,分别用栈辅助去除使得上端点连线上凸的点以及使得下端点连线下凹的点,存下剩下的点,可以连成两条折线,那么满足条件的直线就在两线之间,枚举折线的每个线段,找到满足条件的。
输入样例可以得到如下图:

黄色线是栈里保存的点连成的折线。 代码:
#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <vector>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std; typedef long long ll;
typedef pair<int,int> pa;
int n;
vector<int> p;
pa u[],d[];
int uc,dc;
map<int,int> vis,up,down;
int lx,ly,rx,ry;
inline bool pupl(const pa &p1,const pa &p2,const pa &p3) {
return (ll)(p3.first - p2.first) * (p2.second - p1.second) > (ll)(p2.first - p1.first) * (p3.second - p2.second);
}
inline bool pdownl(const pa &p1,const pa &p2,const pa &p3) {
return (ll)(p3.first - p2.first) * (p2.second - p1.second) < (ll)(p2.first - p1.first) * (p3.second - p2.second);
}
int main() {
int x,y1,y2;
scanf("%d",&n);
for(int i = ;i < n;i ++) {
scanf("%d%d%d",&x,&y1,&y2);
if(vis[x] == ) {
p.push_back(x);
vis[x] = ;
up[x] = y1;
down[x] = y2;
}
else {
up[x] = min(up[x],y1);
down[x] = min(down[x],y2);
}
}
if(p.size() == ) {
lx = p[];
ly = up[p[]];
rx = p[];
ry = down[p[]];
}
else {
sort(p.begin(),p.end());
for(int i = ;i < p.size();i ++) {
while(uc >= && pupl(u[uc - ],u[uc - ],pa(p[i],up[p[i]]))) uc --;
u[uc ++] = pa(p[i],up[p[i]]);
while(dc >= && pdownl(d[dc - ],d[dc - ],pa(p[i],down[p[i]]))) dc --;
d[dc ++] = pa(p[i],down[p[i]]);
}
int i,j;
for(i = ;i < uc - ;i ++) {
for(j = ;j < dc;j ++) {
if(pupl(u[i],d[j],u[i + ])) break;
}
if(j == dc) break;
}
if(i == uc - ) {
for(i = ;i < dc - ;i ++) {
for(j = ;j < uc;j ++) {
if(pdownl(d[i],u[j],d[i + ])) break;
}
if(j == uc) break;
}
lx = d[i].first;
ly = d[i].second;
rx = d[i + ].first;
ry = d[i + ].second;
}
else {
lx = u[i].first;
ly = u[i].second;
rx = u[i + ].first;
ry = u[i + ].second;
}
}
printf("%d %d %d %d",lx,ly,rx,ry);
}
L3-012 水果忍者 (30 分)的更多相关文章
- 前端优秀作品展示,JavaScript 版水果忍者
<水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版的切水果游戏由百度 JS 小组开发,采用 vml + svg 绘图,使用了 Rapha ...
- 作品展示,JavaScript 版水果忍者
点这里 <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版的切水果游戏由百度 JS 小组开发,采用 vml + svg 绘图,使用了 R ...
- 基于html5 canvas和js实现的水果忍者网页版
今天爱编程小编给大家分享一款基于html5 canvas和js实现的水果忍者网页版. <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版 ...
- PTA 07-图5 Saving James Bond - Hard Version (30分)
07-图5 Saving James Bond - Hard Version (30分) This time let us consider the situation in the movie ...
- PTA 社交网络图中结点的“重要性”计算(30 分)
7-12 社交网络图中结点的“重要性”计算(30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互 ...
- L3-015 球队“食物链” (30 分)
L3-015 球队“食物链” (30 分) 某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席 ...
- PAT A1127 ZigZagging on a Tree (30 分)——二叉树,建树,层序遍历
Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can ...
- 04-树6 Complete Binary Search Tree(30 分)
title: 04-树6 Complete Binary Search Tree(30 分) date: 2017-11-12 14:20:46 tags: - 完全二叉树 - 二叉搜索树 categ ...
- PTA 7-2 二叉搜索树的结构(30 分)
7-2 二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大 ...
随机推荐
- 2.7 The Object Model -- Bindings, Observers, Computed Properties:What do I use when?
有时候新用户在使用计算属性.绑定和监视者时感到困惑.下面是一些指导方针: 1. 使用computed properties来合成其他属性,以构建新的属性.computed properties不应该包 ...
- WCF标准绑定以及传输协议与编码格式
WCF 定义了9 种标准绑定: 基本绑定(Basic Binding) 由BasicHttpBinding类提供.基本绑定能够将WCF服务公开为旧的ASMX Web服务,使得旧的客户端能够与新的服务协 ...
- mysql索引之聚簇索引与非聚簇索引
1 数据结构及算法基础 1.1 索引的本质 官方定义:索引(Index)是帮助MySQL高效获取数据的数据结构 本质:索引是数据结构 查询是数据库的最主要功能之一.我们都希望查询速度能尽可能快,因此数 ...
- 文件上传—SSH框架文件上传
1.准备上传的api组件 <dependency> <groupId>commons-io</groupId> <artifactId>commons- ...
- 浅谈JS严格模式
浅谈JS严格模式 简介 何为严格模式?严格模式(strict mode)即在严格的条件下运行,在严格模式下,很多正常情况下不会报错的问题语句,将会报错并阻止运行. 但是,严格模式可以显著提高代码的健壮 ...
- 2017-2018-1 JaWorld 第四、五周作业
2017-2018-1 JaWorld 第四.五周作业 两周工作内容 小组讨论并确定最终的app雏形 合作完成需求说明书 工作分工 成员 分工 比例 陈是奇 1.引言 8% 马平川 2.1-2.5 产 ...
- Java 时间格式处理
jdk里面的日期格式处理使用SimpleDateFormat,这个类其实也是在内部调用的Calendar Calendar概念比较负责,涉及到时区和本地化 看一些简单的demo: package co ...
- Python学习札记(三十三) 面向对象编程 Object Oriented Program 4
参考:继承和多态 NOTE 著名的开闭原则: 对扩展开放:允许新增Animal子类: 对修改封闭:不需要修改依赖Animal类型的Animal_func()等函数. 1.eg. #!/usr/bin/ ...
- 利用Html.css OPPO手机导航菜单的制作解析
<body> <div id="top" class="auto"> <div class="nav"> ...
- pybedtools --bedtools的python包
http://daler.github.io/pybedtools/ 用个下面这个 >>> fn = pybedtools.example_filename('test.fa') & ...