L3-012 水果忍者 (30 分)-PAT 团体程序设计天梯赛 GPLT
2010年风靡全球的“水果忍者”游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以完成游戏规定的任务。如果玩家可以一刀砍下画面当中一连串的水果,则会有额外的奖励,如图1所示。
现在假如你是“水果忍者”游戏的玩家,你要做的一件事情就是,将画面当中的水果一刀砍下。这个问题看上去有些复杂,让我们把问题简化一些。我们将游戏世界想象成一个二维的平面。游戏当中的每个水果被简化成一条一条的垂直于水平线的竖直线段。而一刀砍下我们也仅考虑成能否找到一条直线,使之可以穿过所有代表水果的线段。
如图2所示,其中绿色的垂直线段表示的就是一个一个的水果;灰色的虚线即表示穿过所有线段的某一条直线。可以从上图当中看出,对于这样一组线段的排列,我们是可以找到一刀切开所有水果的方案的。
另外,我们约定,如果某条直线恰好穿过了线段的端点也表示它砍中了这个线段所表示的水果。假如你是这样一个功能的开发者,你要如何来找到一条穿过它们的直线呢?
输入格式:
输入在第一行给出一个正整数N
(≤104),表示水果的个数。随后N
行,每行给出三个整数x、y1、y2,其间以空格分隔,表示一条端点为(x,y1)和(x,y2)的水果,其中y1>y2。注意:给出的水果输入集合一定存在一条可以将其全部穿过的直线,不需考虑不存在的情况。坐标为区间 [−106,106) 内的整数。
输出格式:
在一行中输出穿过所有线段的直线上具有整数坐标的任意两点p1(x1,y1)和p2(x2,y2),格式为 x1y1x2y2。注意:本题答案不唯一,由特殊裁判程序判定,但一定存在四个坐标全是整数的解。
输入样例:
5
-30 -52 -84
38 22 -49
-99 -22 -99
48 59 -18
-36 -50 -72
输出样例:
-99 -99 -30 -52
分析:将所有水果信息按照x轴顺序排列好,枚举每一条水果线段,以最它的最低点作为参照点,然后取和其他所有线段点所成直线的交集。如果与所有的水果都有公共的斜率交集,说明存在以枚举线段最低点为刀砍线上的一个点。方便起见,选取其余线段最大斜率的最小值作为目标直线上的另外一个点,即为答案~Fruit中存储每个水果的坐标信息,kmax表示从枚举点出发能经过所有线段的直线的最大斜率,kmin表示从枚举点出发能经过所有线段的直线的最小斜率,tkmax、tkmin为两个水果之间的最大、最小斜率~
#include <bits/stdc++.h>
using namespace std;
struct node {double x, y1, y2;bool friend operator < (const node &a, const node &b) {return a.x < b.x;}
}Fruit[10000];
int n, hx, hy;
double kmax, kmin, tkmax, tkmin;
int main() {cin >> n;for (int i = 0; i < n; i++) cin >> Fruit[i].x >> Fruit[i].y1 >> Fruit[i].y2;sort(Fruit, Fruit + n);for (int i = 0, j; i < n; i++) {kmax = 1e9, kmin = -1e9;for (j = 0; j < n; j++) {if (i == j) continue;if (i < j) {tkmax = (Fruit[j].y1 - Fruit[i].y2) / (Fruit[j].x - Fruit[i].x);tkmin = (Fruit[j].y2 - Fruit[i].y2) / (Fruit[j].x - Fruit[i].x);} else {tkmax = (Fruit[i].y2 - Fruit[j].y2) / (Fruit[i].x - Fruit[j].x);tkmin = (Fruit[i].y2 - Fruit[j].y1) / (Fruit[i].x - Fruit[j].x);}if (tkmax < kmin || tkmin > kmax) break;if (tkmax < kmax) {kmax = tkmax;hx = Fruit[j].x;hy = Fruit[j].y1;}kmin = max(kmin, tkmin);}if (j == n) {cout << hx << ' ' << hy << ' ' << (int)Fruit[i].x << ' ' << (int)Fruit[i].y2;break;}}return 0;
}
L3-012 水果忍者 (30 分)-PAT 团体程序设计天梯赛 GPLT相关推荐
- L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT
本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...
- L3-017 森森快递 (30 分)-PAT 团体程序设计天梯赛 GPLT
森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号.由于道路限制,第i号城市(i=0,⋯,N−2)与第(i ...
- L3-021 神坛 (30 分)-PAT 团体程序设计天梯赛 GPLT
在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...
- L3-020 至多删三个字符 (30 分)-PAT 团体程序设计天梯赛 GPLT
给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 106] 内的字符串. ...
- L3-016 二叉搜索树的结构 (30 分)-PAT 团体程序设计天梯赛 GPLT
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...
- L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT
正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长城上,建造了许多烽火台.每个烽火台都监视着一个特定的地区范围.一旦某个地区有外敌入侵,值守在对应烽火台上的士兵就会将敌情通报给周围的烽火台,并迅 ...
- L3-006 迎风一刀斩 (30 分)-PAT 团体程序设计天梯赛 GPLT
迎着一面矩形的大旗一刀斩下,如果你的刀够快的话,这笔直一刀可以切出两块多边形的残片.反过来说,如果有人拿着两块残片来吹牛,说这是自己迎风一刀斩落的,你能检查一下这是不是真的吗? 注意摆在你面前的两个多 ...
- L3-023 计算图 (30 分)--PAT 团体程序设计天梯赛 GPLT
"计算图"(computational graph)是现代深度学习系统的基础执行引擎,提供了一种表示任意数学表达式的方法,例如用有向无环图表示的神经网络. 图中的节点表示基本操作或 ...
- L3-022 地铁一日游 (30 分)-PAT 团体程序设计天梯赛 GPLT
森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的最短距离(即计费距离)每 K 公里增加 1 元车费. ...
最新文章
- 编写一个函数进行左移或右移的位运算
- JS-鼠标跟随块(一个小圆点跟着鼠标跑)
- 传智播客韩顺平老师2011ssh实战项目校内网的数据库设计32张表全解
- ajax 传递数组参数
- 读文件并返回其中最大最小行的shell脚本
- linux 内存查看_Linux终端查看最消耗CPU内存的进程
- drupal显示图片_Drupal在多样性和包容性方面显示领导力
- IBM Machine Learning学习笔记——Time Series and Survival Analysis
- java注释指导手册
- js关于两个字符串的加减乘除运算
- Mybatis-02-对数据库的基本操作
- equals和==比较
- Debian8安装TeamViewer远程协助软件
- 灰灰考研c语言讲义,灰灰全书之数据结构试讲
- Spring关于AOP配置举例(注解方式)
- Ubuntu查看并修改DNS
- 服务器接上显示器操作,服务器接上显示器
- Generating Event Causality Hypotheses through Semantic Relation
- 该升级了,阿里云Code升级Codeup | 云效
- 本地客户端(自己的电脑)连接远程Oracle数据库(服务器端),客户端安装步骤