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) ...
随机推荐
- Could not open ServletContext resource [/WEB-INF/applicationContext.xml] 解决办法
Spring官方文档中规定,如果在上下文中没有指定contextConfigLoction配置文件的位置,则会默认去WEB-INF中去寻找对应的配置文件. 理论上classpath的默认路径是WEB- ...
- java中给某个字段加锁
private String buildLock(String str) { StringBuilder sb = new StringBuilder(str); String lock = sb.t ...
- Arduino IDE开发ESP8266-01S连接MQTT服务器 控制继电器点亮LED
准备条件: 1.Arduino IDE 2.ESP-01S模块 2.MQTT服务器 3.手机热点或路由器热点 Wi-Fi芯片 默认订阅的主题是 "开关控制" 当你发送主题 &q ...
- java键盘输入方法-
字符串缓冲方式 BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); String line = null ...
- flink集群模式安装配置
一.手动下载安装包 wget http://mirrors.tuna.tsinghua.edu.cn/apache/flink/flink-1.6.1/flink-1.6.1-bin-hadoop27 ...
- 详解Redis中两种持久化机制RDB和AOF(面试常问,工作常用)
redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Ap ...
- JAVA JVM助记符
ldc:将int/float/String类型的常量值从常量池中推送至栈顶(栈顶的值是即将要用的) bipush:将单字节(-128 ~ 127)的常量值从常量池中推至栈顶 sipush:将一个短整型 ...
- MobPush厂商通道排查
开启log 一.添加开启log代码 有AndroidManifest.xml的 //在AndroidManifest.xml的application标签中添加 <meta-data androi ...
- Spring框架的IOC(控制反转)
1.1.IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制, ...
- 浅谈ES6数组及对象的解构
一.数组的解构,ES6的新特性,主要是方便操作数组,节省不必要的代码,提高代码质量. 上图例子中, example1: 之前想要获取数组中的值,只能挨个获取下标,然后取值 example2:ES6新特 ...