P2600 [ZJOI2008]瞭望塔(半平面交)
题目描述
致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安。
我们将H村抽象为一维的轮廓。如下图所示
我们可以用一条山的上方轮廓折线(x1, y1), (x2, y2), …. (xn, yn)来描述H村的形状,这里x1 < x2 < …< xn。瞭望塔可以建造在[x1, xn]间的任意位置, 但必须满足从瞭望塔的顶端可以看到H村的任意位置。可见在不同的位置建造瞭望塔,所需要建造的高度是不同的。为了节省开支,dadzhi村长希望建造的塔高度尽可能小。
请你写一个程序,帮助dadzhi村长计算塔的最小高度。
输入输出格式
输入格式:
输入文件tower.in第一行包含一个整数n,表示轮廓折线的节点数目。接下来第一行n个整数, 为x1 ~ xn. 第三行n个整数,为y1 ~ yn。
输出格式:
输出文件tower.out仅包含一个实数,为塔的最小高度,精确到小数点后三位。
输入输出样例
6 1 2 4 5 6 7 1 2 2 4 2 1
1.000
说明
对于60%的数据, N ≤ 60;
对于100%的数据, N ≤ 300,输入坐标绝对值不超过106,注意考虑实数误差带来的问题。
首先,塔i顶的位置属于一个区域:有所有相邻的两个点确定直线的组成的凸包
然后出现了许多分段的一次函数,断电是地面上的焦点和凸包的拐,然后最值从端点出取得
因此枚举地面上的焦点和凸包的拐点都算一遍就行了,因为这题的数据比较小,也可以枚举每两条直线的焦点算一遍qwq
然后还有第二种做法就是,考虑地面上的每一个线段,有一个理解是:
瞭望塔建的靠左,为了能看到右边的,要高一点
瞭望塔建的靠右,为了能看到左边的,要高一点
对于任意相意两个点连成的线段,瞭望塔的高度 是单峰函数,而且是下凸函数
三分就完事了
不用(hui)证明 - -
给出第一个做法的码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 typedef double db; 7 const int N=305; 8 const db inf=99999999999.0; 9 int n; 10 db ax[N],ay[N]; 11 struct LINE{ 12 db k,b; //y=kx+b 13 }ln[N]; 14 db ans=inf; 15 db sol(db x){ //计算特定横坐标的最小瞭望塔高度 16 db res=0; 17 for(int i=1;i<n;i++) 18 res=max(res,ln[i].k*x+ln[i].b); 19 return res; 20 } 21 int main(){ 22 scanf("%d",&n); 23 for(int i=1;i<=n;i++) 24 scanf("%lf",&ax[i]); 25 for(int i=1;i<=n;i++) 26 scanf("%lf",&ay[i]); 27 for(int i=1;i<n;i++){ 28 ln[i].k=(ay[i]-ay[i+1])/(ax[i]-ax[i+1]); 29 ln[i].b=ay[i]-ln[i].k*ax[i]; 30 } 31 for(int i=1;i<=n;i++) 32 ans=min(ans,sol(ax[i])-ay[i]); //先枚举每个端点 33 for(int i=1;i<n;i++) 34 for(int j=i+1;j<n;j++){ 35 db x=(ln[i].b-ln[j].b)/(ln[j].k-ln[i].k); //求两直线的交点 36 for(int k=1;k<n;k++) 37 if(ax[k]<=x&&x<=ax[k+1]) 38 ans=min(ans,sol(x)-ln[k].k*x-ln[k].b); //最小化答案 39 } 40 printf("%.3lf\n",ans); 41 return 0; 42 }
转载于:https://www.cnblogs.com/zhangbuang/p/10549114.html
P2600 [ZJOI2008]瞭望塔(半平面交)相关推荐
- luogu P2600 [ZJOI2008]瞭望塔
luogu P2600 [ZJOI2008]瞭望塔 大意 题目讲得很清楚啊 题解 可以发现,那个点一定是某两条直线的交点 然后直接枚举两条直线就好了 // luogu-judger-enable-o2 ...
- [P2600][ZJOI2008]瞭望塔(半平面交)
先在一个无穷高的位置画一条线为上界,把左右两端点向上连,形成一个封闭的多边形,求半平面交找到瞭望塔顶可以在的区域.因为点和点都是以直线连接的,斜率固定,所以半平面交到底边距离最近的点一定是某个拐点.那 ...
- [BZOJ 1038][ZJOI 2008]瞭望塔(半平面交)
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1038 思路 这个题在上海ACM/ICPC冬令营的比赛中也考过,不是很难,不过想要想到用半平 ...
- P2600 [ZJOI2008]瞭望塔
传送门 暴力也行,退火也行,不是很明白为啥还要用半平面交-- 总之就是把原来的所有限制看成一堆半平面 根据黄学长的博客塔肯定建在转折处最优 //minamoto #include<bits/st ...
- bzoj1038 [ZJOI2008]瞭望塔(半平面交)
bzoj1038 [ZJOI2008]瞭望塔 原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1038 题意: 村中要建立一个瞭望塔,我们将H ...
- 【BZOJ 1038】 1038: [ZJOI2008]瞭望塔
1038: [ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们 将H村抽象为一维的轮廓.如下图所 ...
- 【BZOJ 1038】 [ZJOI2008]瞭望塔
1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 973 Solved: 428 [ Submit][ S ...
- bzoj千题计划126:bzoj1038: [ZJOI2008]瞭望塔
http://www.lydsy.com/JudgeOnline/problem.php?id=1038 本题可以使用三分法 将点按横坐标排好序后 对于任意相邻两个点连成的线段,瞭望塔的高度 是单峰函 ...
- bzoj 1038 [ZJOI2008]瞭望塔
1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2438 Solved: 1004 [Submit][Sta ...
最新文章
- 需要反射时使用dynamic
- LeetCode 76. Minimum Window Substring / 567. Permutation in String
- Linux centos7 NMAP网络探测工具安装过程以及使用示例!
- 薛其坤、向涛两位院士,担任这家研究院联合院长
- JS选中OPTION
- 我对观察者模式的理解,之前一直很乱
- iOS轻量分组日志工具 Log4OC
- Linux系统磁状态检测,检测Linux硬件状态
- SAP面向iOS设备推Cloud Platform SDK工具
- 10.30完美笔试题
- 嵌入式操作系统内核原理和开发(开篇)
- 【Linux】详解Linux中3个文件查找相关命令
- 软件项目管理MOOC(北邮)——第四章测试答案
- ORL Character Recgnition
- 未来教育计算机二级office评分有问题,未来教育计算机二级-未来教育计算机二级msoffice题库评分 – 手机爱问...
- 从faker.js 开源作者Marak已删除了GIthub所有代码我们得到了什么教训
- aardio - 时钟例程
- 数学运算符号的英文表达
- 数字滚动(微信小程序)
- Notepad++统计文本字数
热门文章
- 立方卷积插值 matlab,matlab旋转实现(最近邻值,双线性,三次卷积插值实现插值)
- linux 串口 设置rts,linux内核关于uart2配置为RTS引脚时,串口无法使用的问题
- 花朝节汉服摄影征集、照片征集、视频征集小程序
- 商场根据会员积分打折
- QT 小游戏 : 别踩白块儿~
- [BUUCTF]PWN——mrctf2020_shellcode_revenge(可见字符shellcode)
- 大数据离线流程(小练习二)
- 2021.9.9科研日志
- SQL笔试题:某团数分岗笔试真题详解
- 关于CWnd和HWND