正如我们所知,中国古代长城的建造是为了抵御外敌入侵。在长城上,建造了许多烽火台。每个烽火台都监视着一个特定的地区范围。一旦某个地区有外敌入侵,值守在对应烽火台上的士兵就会将敌情通报给周围的烽火台,并迅速接力地传递到总部。

现在如图1所示,若水平为南北方向、垂直为海拔高度方向,假设长城就是依次相联的一系列线段,而且在此范围内的任一垂直线与这些线段有且仅有唯一的交点。

进一步地,假设烽火台只能建造在线段的端点处。我们认为烽火台本身是没有高度的,每个烽火台只负责向北方(图1中向左)瞭望,而且一旦有外敌入侵,只要敌人与烽火台之间未被山体遮挡,哨兵就会立即察觉。当然,按照这一军规,对于南侧的敌情各烽火台并不负责任。一旦哨兵发现敌情,他就会立即以狼烟或烽火的形式,向其南方的烽火台传递警报,直到位于最南侧的总部。

以图2中的长城为例,负责守卫的四个烽火台用蓝白圆点示意,最南侧的总部用红色圆点示意。如果红色星形标示的地方出现敌情,将被哨兵们发现并沿红色折线将警报传递到总部。当然,就这个例子而言只需两个烽火台的协作,但其他位置的敌情可能需要更多。

然而反过来,即便这里的4个烽火台全部参与,依然有不能覆盖的(黄色)区域。

另外,为避免歧义,我们在这里约定,与某个烽火台的视线刚好相切的区域都认为可以被该烽火台所监视。以图3中的长城为例,若A、B、C、D点均共线,且在D点设置一处烽火台,则A、B、C以及线段BC上的任何一点都在该烽火台的监视范围之内。

好了,倘若你是秦始皇的太尉,为不致出现更多孟姜女式的悲剧,如何在保证长城安全的前提下,使消耗的民力(建造的烽火台)最少呢?

输入格式:

输入在第一行给出一个正整数N(3 ≤ N ≤105),即刻画长城边缘的折线顶点(含起点和终点)数。随后N行,每行给出一个顶点的xy坐标,其间以空格分隔。注意顶点从南到北依次给出,第一个顶点为总部所在位置。坐标为区间[−109,109)内的整数,且没有重合点。

输出格式:

在一行中输出所需建造烽火台(不含总部)的最少数目。

输入样例:

10
67 32
48 -49
32 53
22 -44
19 22
11 40
10 -65
-1 -23
-3 31
-7 59

输出样例:

2

分析:根据题目易知,我们需要判断一共有几个凸出来的点。可以借助堆栈结构,从南到北判断每个点是否为凸出点,不是的话说明可以被前面某个烽火台观测到,直接弹出就不用管了。每次判断三个点,当前输入点l,上一个留在堆栈内的待观察点mid和再前面一个点r,如果直线lr的斜率是否大于等于(题目特殊规定)直线lmid的斜率,是的话说明不是凸出来点。当栈中存在大于2个的点时,表示mid点为烽火。top表示栈顶,X,Y中存储折线顶点坐标,tower为模拟堆栈数组,vis数组中记录某个点是否被标记为烽火台,函数isConcave判断是否是凹点或平行中点~

#include <bits/stdc++.h>
using namespace std;
long long n, top, ans, X[100005], Y[100005], tower[100005], vis[100005];
bool isConcave (const int &l, const int &mid, const int &r) {return (Y[r] - Y[l]) * (X[mid] - X[l]) >= (Y[mid] - Y[l]) * (X[r] - X[l]);
}
int main() {cin >> n;for (int i = 0; i < n; i++) {cin >> X[i] >> Y[i];if (top) {while (top > 1 && isConcave(i, tower[top], tower[top - 1])) top--;if (top != 1 && !vis[tower[top]]) vis[tower[top]] = 1, ans++;}tower[++top] = i;}cout << ans;return 0;
}

L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT相关推荐

  1. L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT

    本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...

  2. L3-017 森森快递 (30 分)-PAT 团体程序设计天梯赛 GPLT

    森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号.由于道路限制,第i号城市(i=0,⋯,N−2)与第(i ...

  3. L3-012 水果忍者 (30 分)-PAT 团体程序设计天梯赛 GPLT

    2010年风靡全球的"水果忍者"游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以 ...

  4. L3-021 神坛 (30 分)-PAT 团体程序设计天梯赛 GPLT

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...

  5. L3-020 至多删三个字符 (30 分)-PAT 团体程序设计天梯赛 GPLT

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 106] 内的字符串. ...

  6. L3-016 二叉搜索树的结构 (30 分)-PAT 团体程序设计天梯赛 GPLT

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

  7. L3-006 迎风一刀斩 (30 分)-PAT 团体程序设计天梯赛 GPLT

    迎着一面矩形的大旗一刀斩下,如果你的刀够快的话,这笔直一刀可以切出两块多边形的残片.反过来说,如果有人拿着两块残片来吹牛,说这是自己迎风一刀斩落的,你能检查一下这是不是真的吗? 注意摆在你面前的两个多 ...

  8. L3-023 计算图 (30 分)--PAT 团体程序设计天梯赛 GPLT

    "计算图"(computational graph)是现代深度学习系统的基础执行引擎,提供了一种表示任意数学表达式的方法,例如用有向无环图表示的神经网络. 图中的节点表示基本操作或 ...

  9. L3-022 地铁一日游 (30 分)-PAT 团体程序设计天梯赛 GPLT

    森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的最短距离(即计费距离)每 K 公里增加 1 元车费. ...

最新文章

  1. Linux系统性能分析: CPU
  2. 读书笔记-我所理解的生活
  3. Eclipse导入Maven项目解决Build Path不能配置问题
  4. python sort 部分元素_Python 犄角旮旯--List
  5. Intellij Idea 创建Web项目入门(一)
  6. 为啥地址线是20根则存储单元个数为2的20
  7. ios 如何获得系统时间和日期
  8. SQL73 考试分数(二)
  9. 中移动总裁李跃:发展Wifi才是长久之计
  10. esxi时区设置 +8_ESXI安装OpenWRT amp; LEDE软路由部署指南(附镜像下载)
  11. Python容器专题 - deque(队列)--双向队列对象
  12. 黑客攻击手段揭秘(转)
  13. Java 冻结或解除冻结Excel中的行和列的方法
  14. 带宽与码元的关系_带宽和传输速率的关系是什么?
  15. 【华为OD机试 2023】完美走位(C++ Java JavaScript Python 100%)
  16. 科技云报道:数字化转型提速,深信服有答案
  17. 快醒醒吧!数据库mysql外文参考文献
  18. secret学习笔记
  19. Java的wait()、notify()学习三部曲之一:JVM源码分析
  20. 3、Origin安装教程

热门文章

  1. ViewFlipper的简单使用
  2. 开机即启动Activity
  3. Android4.2中Phone的P-sensor的应用的分析。
  4. MFC实现Flash动画播放
  5. Linux 基本权限管理
  6. webpack4.x实战七,生产模式和开发模式分开打包
  7. 简单的jQuery获取URL的?后带的参数
  8. Emacs学习笔记(6):常用命令备忘(打印版)
  9. 微软提高 Microsoft 365 的漏洞奖励
  10. 【BlackHat】黑帽大会上值得关注的安全工具