bzoj1038 [ZJOI2008]瞭望塔
Description
致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安。我们
将H村抽象为一维的轮廓。如下图所示 我们可以用一条山的上方轮廓折线(x1, y1), (x2, y2), …. (xn, yn)来描
述H村的形状,这里x1 < x2 < …< xn。瞭望塔可以建造在[x1, xn]间的任意位置, 但必须满足从瞭望塔的顶端可
以看到H村的任意位置。可见在不同的位置建造瞭望塔,所需要建造的高度是不同的。为了节省开支,dadzhi村长
希望建造的塔高度尽可能小。请你写一个程序,帮助dadzhi村长计算塔的最小高度。
Input
第一行包含一个整数n,表示轮廓折线的节点数目。接下来第一行n个整数, 为x1 ~ xn. 第三行n个整数,为y1
~ yn。
Output
仅包含一个实数,为塔的最小高度,精确到小数点后三位。
Sample Input
【输入样例一】
6
1 2 4 5 6 7
1 2 2 4 2 1
【输入样例二】
4
10 20 49 59
0 10 10 0
Sample Output
【输出样例一】
1.000
【输出样例二】
14.500
HINT
N ≤ 300,输入坐标绝对值不超过106,注意考虑实数误差带来的问题。
我们先求一个半平面交
答案只可能出现在半平面的折点和地面上的城市折点上
tip
在求直线的时候,一定要按顺序
在用线切割的时候,只用给出的n个点组成的线切割
只要涉及到double类型的比较,都要用dcmp
eps=1e-10
这里写代码片
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>using namespace std;const int N=100001;
const double eps=1e-10;
const double INF=1e10;
struct node{double x,y;node (double xx=0,double yy=0){x=xx;y=yy;}
};
node po[N],p[N],q[N],g[N];
int n,m,nn;
double a,b,c;int dcmp(double x)
{if (fabs(x)<eps) return 0;else if (x>0) return 1;else return -1;
}node operator +(const node &x,const node &y){return node(x.x+y.x,x.y+y.y);}
node operator -(const node &x,const node &y){return node(x.x-y.x,x.y-y.y);}
node operator *(const node &x,const double &y){return node(x.x*y,x.y*y);}
node operator /(const node &x,const double &y){return node(x.x/y,x.y/y);}double Cross(const node x,const node y){return x.x*y.y-x.y*y.x;}
double Dot(const node x,const node y){return x.x*y.x+x.y*y.y;}void getline(node x,node y)
{a=y.y-x.y;b=x.x-y.x;c=x.y*y.x-x.x*y.y;
}node insert(node x,node y)
{double u=fabs(a*x.x+b*x.y+c);double v=fabs(a*y.x+b*y.y+c);node ans;ans.x=(u*y.x+v*x.x)/(u+v);ans.y=(u*y.y+v*x.y)/(u+v);return ans;
}void cut()
{int cnt=0;for (int i=1;i<=m;i++){if (dcmp(a*p[i].x+b*p[i].y+c)<=0) q[++cnt]=p[i]; //直线左侧else{if (dcmp(a*p[i-1].x+b*p[i-1].y+c)<0) q[++cnt]=insert(p[i-1],p[i]);if (dcmp(a*p[i+1].x+b*p[i+1].y+c)<0) q[++cnt]=insert(p[i+1],p[i]);} }for (int i=1;i<=cnt;i++) p[i]=q[i];p[0]=p[cnt]; p[cnt+1]=p[1];m=cnt;
}void solve()
{int i;for (i=1;i<=n;i++) p[i]=po[i];m=n;p[0]=p[n]; p[n+1]=p[1]; po[0]=po[n]; po[n+1]=po[1];for (int i=2;i<=nn;i++) //<=nn{getline(po[i-1],po[i]);cut();}
}void doit()
{int i,j,k;double ans=1e60;g[nn+1]=g[1]; g[0]=g[nn];for (i=1;i<=nn;i++)for (j=1;j<=m;j++)if (dcmp(p[j].x-g[i].x)<=0&&dcmp(p[j+1].x-g[i].x)>=0){getline(p[j],p[j+1]);double yy=(a*g[i].x+c)/(-b);yy=abs(yy-g[i].y);if (dcmp(ans-yy)>0) ans=yy;}for (i=1;i<=m;i++)for (j=1;j<=nn;j++)if (dcmp(g[j].x-p[i].x)<=0&&dcmp(g[j+1].x-p[i].x)>=0){getline(g[j],g[j+1]);double yy=(a*p[i].x+c)/(-b);yy=abs(yy-p[i].y);if (dcmp(ans-yy)>0) ans=yy;}printf("%0.3lf",ans);
}int main()
{scanf("%d",&n); nn=n;if (n==1){printf("0.000");return 0;}for (int i=1;i<=n;i++) scanf("%lf",&po[i].x),g[i].x=po[i].x;for (int i=1;i<=n;i++) scanf("%lf",&po[i].y),g[i].y=po[i].y;po[++n].x=INF; po[n].y=-INF; //逆时针po[++n].x=INF; po[n].y=INF;po[++n].x=-INF; po[n].y=INF;po[++n].x=-INF; po[n].y=-INF;solve();doit();return 0;
}
转载于:https://www.cnblogs.com/wutongtong3117/p/7673295.html
bzoj1038 [ZJOI2008]瞭望塔相关推荐
- bzoj1038 [ZJOI2008]瞭望塔(半平面交)
bzoj1038 [ZJOI2008]瞭望塔 原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1038 题意: 村中要建立一个瞭望塔,我们将H ...
- bzoj千题计划126:bzoj1038: [ZJOI2008]瞭望塔
http://www.lydsy.com/JudgeOnline/problem.php?id=1038 本题可以使用三分法 将点按横坐标排好序后 对于任意相邻两个点连成的线段,瞭望塔的高度 是单峰函 ...
- [BZOJ1038][ZJOI2008]瞭望塔(半平面交)
题目: 我是超链接 题解: 很显然,只有瞭望塔和每个山顶形成直线的斜率的绝对值大于对应山坡的斜率,这个山坡才能看见.不难想到对所有的山坡求一个半平面交然后找到有山顶存在的部分,这个n<=300也 ...
- bzoj1038: [ZJOI2008]瞭望塔
Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们 将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1 ...
- bzoj1038 [ZJOI2008]瞭望塔 枚举
这个题实际上求的是半个凸包的核,但只需要枚举直线两两交点和地上的点就可以很快跑过 根据线性规划原理答案应该在直线交点上,为什么还要看地上的点? 因为实际上可行域是有下限的,有可能下限与地线重合 码(注 ...
- [BZOJ1038]ZJOI2008瞭望塔|半平面交
考虑某个村庄可以被看见的区域,发现一条线段的上方就是可以看见端点的区域,那就把所有线段扔进去做半平面交,不要忘记了要加上两条左右边界..求出来之后发现答案要么是某个村庄往上到半平面交的一段距离,要么是 ...
- 【BZOJ 1038】 1038: [ZJOI2008]瞭望塔
1038: [ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们 将H村抽象为一维的轮廓.如下图所 ...
- bzoj 1038 [ZJOI2008]瞭望塔
1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2438 Solved: 1004 [Submit][Sta ...
- luogu P2600 [ZJOI2008]瞭望塔
luogu P2600 [ZJOI2008]瞭望塔 大意 题目讲得很清楚啊 题解 可以发现,那个点一定是某两条直线的交点 然后直接枚举两条直线就好了 // luogu-judger-enable-o2 ...
最新文章
- MDL估计算法程序C语言,MDLS算法浅谈
- POI按照源单元格设置目标单元格格式
- ST单片机使用ST Visual Programmer软件烧录程序简易教程
- No Fine-Tuning, Only Prefix-Tuning
- 那时我大约5岁的飞鸽传书
- Win7服务器搭建实例教程:教你Win7如何搭建Web服务器【转载】
- Phoenix使用注意事项以及跟标准sql的不同
- java 实现excel与txt 相互转化
- 关于min max 函数凹凸性,以及报童模型中期望库存,期望缺货量的性质
- TP6使用redis
- html 自适应 音乐播放器,mmPlayer:一款基于Vue的自适应Web在线音乐播放器
- docker部署eureka时无法启动容器(问题解决)
- NLP与对比学习的巧妙融合,简单暴力效果显著!
- 计算机主板是cpu吗,主板和cpu是一起的吗
- GitHub 又一黑科技项目面世!网友惊呼:这也太强了
- Python 库 资源大全
- postman 获取接口参数_postman 接口参数化操作
- 在win10上通过usb连接树莓派
- 如何避免内存溢出和频繁的垃圾回收
- 03 TI OMAPL138E Linux移植 (Davinci) (资源获取+从串口启动UBoot+从网络启动Linux与文件系统)
热门文章
- python 上传文件夹,python – 使用Flask上传文件夹/文件
- oracle取消180天过期,Oracle密码过期如何取消密码180天限制及密码180天过期,账号锁住的问题...
- 你一定不能错过,Java视频全套
- Zookeeper一致性级别分析,终于彻底把握了
- Android移动开发之【通往安卓的神奇之旅】Senior VIew高级组件与onClickListener()再探索
- Android移动开发之【Android实战项目】漂亮Button样式
- Unet实现图像分割(二)
- JavaScript语言基础.上
- curl 探测java网站_使用cURL查找网站重定向的位置?
- redis主从_Redis主从复制部署