7-15 水果忍者 (30 分)

2024-04-14 14:32
文章标签 15 30 水果 忍者

本文主要是介绍7-15 水果忍者 (30 分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PS:本题博主没写出来,看了下面这位博主的写法豁然开朗,附上连接:https://www.cnblogs.com/albert-biu/p/10530286.html

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

图 1

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

图 2

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

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

输入格式:

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

输出格式:

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

输入样例:

5
-30 -52 -84
38 22 -49
-99 -22 -99
48 59 -18
-36 -50 -72

输出样例:

-99 -99 -30 -52对于所有线段的上端点求一个下凸,下端点求一个上凸,因为题目说一定存在一个可行解,则可行解一定在这两个凸包之间。分为两种情况
一、所有的上端点都在下端点凸包一边的上侧,则这条边就是一个可行解。
二、对于上端点凸包的一条边,所有下端点凸包上的点都等于它,那么这条边就是一个可行解。
#include "bits/stdc++.h"using namespace std;
const int maxn = 1e4 + 1000;
const int inf = 0x3f3f3f3f;
int sup[maxn], sdown[maxn];
int n;
struct point {int x, y;
} up[maxn], down[maxn];bool cmp(point a, point b) {if (a.x != b.x) return a.x < b.x;return a.y < b.y;
}bool checkup(point a, point b, point c) {//不满足下凸返回truereturn 1ll * (b.x - a.x) * (c.y - b.y) - 1ll * (c.x - b.x) * (b.y - a.y) < 0;
}bool checkdown(point a, point b, point c) {//不满足上凸返回truereturn 1ll * (b.x - a.x) * (c.y - b.y) - 1ll * (c.x - b.x) * (b.y - a.y) > 0;
}int main() {cin >> n;int a, b, c;for (int i = 0; i < n; i++) {cin >> a >> b >> c;up[i].x = down[i].x = a;up[i].y = b;down[i].y = c;}sort(up, up + n, cmp);sort(down, down + n, cmp);int dx = 0;int to = n;for (int i = 1; i < n; i++) {if (up[i].x == up[dx].x) {up[i].x = inf;up[dx].y = min(up[i].y, up[dx].y);to--;} else {dx = i;}}dx = 0;for (int i = 1; i < n; i++) {if (down[i].x == down[dx].x) {down[i].x = inf;down[dx].y = max(down[i].y, down[dx].y);} else {dx = i;}}sort(up, up + n, cmp);sort(down, down + n, cmp);if (to == 1) {printf("%d %d %d %d\n", up[0].x, up[0].y, down[0].x, down[0].y);return 0;}int upos = 0, dpos = 0;for (int i = 0; i < to; i++) {while (upos >= 2 && checkup(up[sup[upos - 2]], up[sup[upos - 1]], up[i]))upos--;sup[upos++] = i;while (dpos >= 2 && checkdown(down[sdown[dpos - 2]], down[sdown[dpos - 1]], down[i]))dpos--;sdown[dpos++] = i;}int i, j;point ansl, ansr;for (i = 0; i < upos - 1; i++) {for (j = 0; j < dpos; j++) {if (checkup(up[sup[i]], down[sdown[j]], up[sup[i + 1]])) break;}if (j == dpos) break;}if (i == upos - 1) {for (i = 0; i < dpos - 1; i++) {for (j = 0; j < upos; j++) {if (checkdown(down[sdown[i]], up[sup[j]], down[sdown[i + 1]])) break;}if (j == upos) break;}ansl = down[sdown[i]];ansr = down[sdown[i + 1]];} else {ansl = up[sup[i]];ansr = up[sup[i + 1]];}printf("%d %d %d %d\n", ansl.x, ansl.y, ansr.x, ansr.y);return 0;
}

 

这篇关于7-15 水果忍者 (30 分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903235

相关文章

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

904.水果成篮

题目 链接:leetcode链接 思路分析(滑动窗口) 读完题目,很明显,这个题目需要我们寻找一个最长子数组,使得这个子数组里面最多存在两种不同的数字,很容易联想到使用滑动窗口。 另外,需要使用hash表来记录区间内的不同种水果的个数 首先还是left,right = 0; 进窗口:right进哈希表 判断:哈希表的size > 2,就需要出窗口 出窗口:hash[left]–的同时,

Adblock Plus官方规则Easylist China说明与反馈贴(2015.12.15)

-------------------------------特别说明--------------------------------------- 视频广告问题:因Adblock Plus的局限,存在以下现象,优酷、搜狐、17173黑屏并倒数;乐视、爱奇艺播放广告。因为这些视频网站的Flash播放器被植入了检测代码,而Adblock Plus无法修改播放器。 如需同时使用ads

15 组件的切换和对组件的data的使用

划重点 a 标签的使用事件修饰符组件的定义组件的切换:登录 / 注册 泡椒鱼头 :微辣 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-

c++习题30-求10000以内N的阶乘

目录 一,题目  二,思路 三,代码    一,题目  描述 求10000以内n的阶乘。 输入描述 只有一行输入,整数n(0≤n≤10000)。 输出描述 一行,即n!的值。 用例输入 1  4 用例输出 1  24   二,思路 n    n!           0    1 1    1*1=1 2    1*2=2 3    2*3=6 4