2010年风靡全球的“水果忍者”游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以完成游戏规定的任务。如果玩家可以一刀砍下画面当中一连串的水果,则会有额外的奖励,如图1所示。

图 1

现在假如你是“水果忍者”游戏的玩家,你要做的一件事情就是,将画面当中的水果一刀砍下。这个问题看上去有些复杂,让我们把问题简化一些。我们将游戏世界想象成一个二维的平面。游戏当中的每个水果被简化成一条一条的垂直于水平线的竖直线段。而一刀砍下我们也仅考虑成能否找到一条直线,使之可以穿过所有代表水果的线段。

图 2

如图2所示,其中绿色的垂直线段表示的就是一个一个的水果;灰色的虚线即表示穿过所有线段的某一条直线。可以从上图当中看出,对于这样一组线段的排列,我们是可以找到一刀切开所有水果的方案的。

另外,我们约定,如果某条直线恰好穿过了线段的端点也表示它砍中了这个线段所表示的水果。假如你是这样一个功能的开发者,你要如何来找到一条穿过它们的直线呢?

输入格式:

输入在第一行给出一个正整数N(≤),表示水果的个数。随后N行,每行给出三个整数x、y​1​​、y​2​​,其间以空格分隔,表示一条端点为(和(的水果,其中y​1​​>y​2​​。注意:给出的水果输入集合一定存在一条可以将其全部穿过的直线,不需考虑不存在的情况。坐标为区间 [ 内的整数。

输出格式:

在一行中输出穿过所有线段的直线上具有整数坐标的任意两点(和(,格式为 y​1​​。注意:本题答案不唯一,由特殊裁判程序判定,但一定存在四个坐标全是整数的解。

输入样例:

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

  1. 前端优秀作品展示,JavaScript 版水果忍者

    <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版的切水果游戏由百度 JS 小组开发,采用 vml + svg 绘图,使用了 Rapha ...

  2. 作品展示,JavaScript 版水果忍者

    点这里 <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版的切水果游戏由百度 JS 小组开发,采用 vml + svg 绘图,使用了 R ...

  3. 基于html5 canvas和js实现的水果忍者网页版

    今天爱编程小编给大家分享一款基于html5 canvas和js实现的水果忍者网页版. <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版 ...

  4. 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 ...

  5. PTA 社交网络图中结点的“重要性”计算(30 分)

    7-12 社交网络图中结点的“重要性”计算(30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互 ...

  6. L3-015 球队“食物链” (30 分)

    L3-015 球队“食物链” (30 分)   某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席 ...

  7. 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 ...

  8. 04-树6 Complete Binary Search Tree(30 分)

    title: 04-树6 Complete Binary Search Tree(30 分) date: 2017-11-12 14:20:46 tags: - 完全二叉树 - 二叉搜索树 categ ...

  9. PTA 7-2 二叉搜索树的结构(30 分)

    7-2 二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大 ...

随机推荐

  1. 1 :2 Strust2—Demo

    =============================================================== Demo基础包:

  2. 2016-2017 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) Solution

    A:Alphabet Solved. 签. #include<bits/stdc++.h> using namespace std; ]; ]; int main(){ scanf(); ...

  3. java -- JVM的符号引用和直接引用

    在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可 ...

  4. fileupload上传文件时带参数

    var userID = ""; $('#picture').fileupload({ url: "http://localhost:35708/Handler/File ...

  5. python基础学习十 logging模块详细使用【转载】

    很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出 ...

  6. 关于Redis命令keys在性能方面的说明

    redis的keys命令类似于Mysql的like命令,无非就是模糊匹配相近的字符数据. KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 k ...

  7. 转载:使用 OpenCV 识别 QRCode

    原文链接:http://coolshell.cn/articles/10590.html#jtss-tsina 识别二维码的项目数不胜数,每次都是开箱即用,方便得很. 这次想用 OpenCV 从零识别 ...

  8. The Road to Ryu: Hi Ryu

    参考: ryu入门教程 ryu ryu/ryu Structure -ryu/ryu app base cmd contrib controller lib ofproto services test ...

  9. 2016湘潭邀请赛—Gambling

    http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1244 题意:有a个红球,b个绿球,c个黄球,先拿完a个红球一等奖,先拿完b ...

  10. maven clean 异常问题

    当使用`mvn clean`,报`maven… Failed to clean project: Failed to delete ..`时,如果你觉得这个文件删除成功或失败没有关系,可以使用如下命令 ...