P1663 山
写在前面
简单的二分答案,稍微加点数学计算,很有意思。
算法思路
二分答案可行的原因:答案具有单调性。
这道题目中证明一下:首先无限高显然是能看到任何一个点的,且山的每一条边都是对答案的一个限制,因此位置越低可能受到的限制就越多,能看到所有位置的机会就越少,直至出现不可行的答案。
因此只需要统计出每一对相邻的折点,求解出这两点所在的直线方程。随后二分答案。
对于每个可能二分到的答案,每条直线的限制都会与其构成一个一元不等式,将所有的不等式组成不等式组,判断其是否有解。
Code
#include<bits/stdc++.h>
#define LF double
const int Maxn = 5e3 + 5;
const LF eps = 1e-2;
int n, x5, y5, x6, y6;
double k[Maxn], b[Maxn];
int cnt = 0;
void solve(int x3, int y3, int x4, int y4) {
cnt++;
k[cnt] = 1.000 * (y3 - y4) / (x3 - x4);
b[cnt] = 1.000 * y3 - 1.000 * k[cnt] * x3;
}
using namespace std;
inline int read() {
int f = 1, w = 0; char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '- ') f = -1;
for(; isdigit(ch); ch = getchar()) w = (w << 3) + (w << 1) + (ch ^ '0');
return f * w;
}
bool check(LF h) {
LF lf = 0, rt = (LF)x6;
for(register int i = 1; i <= cnt; ++i) {
if(k[i] > 0) rt = min(rt, (h - b[i]) / k[i]);
else lf = max(lf, (h - b[i]) / k[i]);
}
return lf <= rt;
}
int main() {
n = read();
x5 = read(); y5 = read();
for(register int i = 1; i < n; ++i) {
x6 = read(); y6 = read();
solve(x5, y5, x6, y6);
x5 = x6; y5 = y6;
}
LF l = 0, r = 1000000, mid, ans;
while((l <= r) && (r - l > eps)) {
mid = (l + r) / 2;
if(check(mid)) {
ans = mid;
r = mid - eps;
}
else {
l = mid + eps;
}
}
printf("%.2lf", ans);
return 0;
}
P1663 山的更多相关文章
- luogu P1663 山
题目链接 luogu P1663 山 题解 只需要求出下凸包的最低点就好了 显然是由两个斜率相反的直线相交来的 盼下最低点为直线的情况 代码 #include<cstdio> #inclu ...
- 洛谷 - P1663 - 山 - 半平面交
https://www.luogu.org/problemnew/show/P1663 给定山的性状,求一个最低点可以看见所有的地方. 就是半平面交. 粘贴全家福: #include<bits/ ...
- 洛谷 P1663 山
https://www.luogu.org/problemnew/show/P1663 可能在这里看会好一点:[题解]
- Luogu P1663 山【二分答案/实数域】By cellur925
题目传送门 现在要在山上的某个部位装一盏灯,使得这座山的任何一个部位都能够被看到. 给出最小的y坐标,如图的+号处就是y坐标最小的安装灯的地方. 这个题嘛...今年省选前学姐来我们(破烂)的机房串门的 ...
- HDU2063 过山车
过山车 RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是, ...
- HDOJ 2063 过山车
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Xamarin.Android之山有木兮之木有枝,心悦君兮君不知。
Xamarin.Android之山有木兮之木有枝,心悦君兮君不知. 第一步,写项目中的第一个界面. <?xml version="1.0" encoding =" ...
- hdu 2063 过山车(匈牙利算法模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others) Memory ...
- HDU- 2063 过山车
http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车//我的第一个二分匹配 Time Limit: 1000/1000 MS (Java/Others) ...
随机推荐
- 嵌入式Linux-LCD显示多行文字
显示文字这里我用了freetype库. 以左上角显示两行文字: #include <sys/types.h> #include <sys/stat.h> #include &l ...
- LeapMotion控制器 java语言开发笔记--(连接控制器)
(1)为了连接LeapMotion控制器,创建controller对象,这个对象自动创建与控制器的服务或者后台程序连接,然后捕获数据提供给你的应用程序.可以使用该对象来获取连接信息. (2)获取Fra ...
- Head First 设计模式 —— 05. 单例模式
全局变量的缺点 如果将对象赋值给一个全局变量,那么必须在程序一开始就创建好对象 P170 和 JVM 实现有关,有些 JVM 的实现是:在用到的时候才创建对象 思考题 Choc-O-Holic 公司使 ...
- linux系统修改Swap分区【转】
在装完Linux系统之后自己去修改Swap分区的大小(两种方法) 在安装完Linux系统后,swap分区太小怎么办,怎么可以扩大Swap分区呢?有两个办法,一个是从新建立swap分区,一个是增加swa ...
- Unity优化 1
浅谈Unity中的GC以及优化(转) Unity 官方文档,正巧在博客园发现了已经有位大神(zblade)把原文翻译出来了,而且质量很高~,译文地址 在这里.下面我就可耻地把译文搬运了过来,作为上面思 ...
- python学习笔记 | 猜拳游戏
''' @author: 人人都爱小雀斑 @time: 2020/3/6 18:52 @desc: 实验结果心得: 1.难点主要在判断谁输谁赢 2.挺好的 ''' import random d={1 ...
- 【Linux】Linux介绍和安装 - 测试题
第一部分测试题 Linux介绍和安装 测试题 做点练习题,巩固一下咯~ ~ _ 10 个选择题. 1.让我们选择开机时进哪个操作系统的软件叫什么? A. booter B. bootloader C. ...
- 【RAC】Oracle 10g RAC相关启停命令,维护命令
Oracle10g RAC关闭及启动步骤 情况1:需要关闭DB(所有实例),OS及Server. a.首先停止Oracle10g环境 $ lsnrctl stop (每个节点上停止监听,也可以用s ...
- ctfhub技能树—sql注入—报错注入
打开靶机 payload 1 Union select count(*),concat((查询语句),0x26,floor(rand(0)*2))x from information_schema.c ...
- postgresql数据库升级
pg_upgrade官网介绍:https://www.postgresql.org/docs/10/pgupgrade.html 1.查看老版本数据库编译参数值并记录 select name,sett ...