wall poj 1113
题目链接:http://poj.org/problem?id=1113
题意:一个国王要在自己的城堡周围建一堵围墙,要求围墙距城堡最短距离为L。问建这样一堵围墙的最短长度是多少。
题解思路:显然围墙建的距城堡越近越好,这样对于城堡的边我们沿着城堡距离L的地方建就可以了,对于城堡的顶点,我们以顶点为圆心,以L为半径画一段圆弧。易之围墙的周长即为圆弧和+沿城堡建的围墙的和。
但题目并没说给的多变形就是凸多边形。显然如果是凸多边形的话,直接用上面的方法计算即可。而对于凹多边形凹的部分如果我们也像上面的做法那样沿着城堡的边建围墙,顶点画圆弧,然后两者再加起来的话显然是错误的,因为我们知道两点之间直线最短,这样做得到的边长和显然要大于两点间的直线段的和!所以对于凹多边形,我们的做法是用一条线段直接将凹下去两点连起来,使之成为一个凸包。所以这样题目就很简单了,直接用扫描法构造凸包,将其中凹下去的部分舍掉即可。
还有一点,凸多边形的外角和等于360度,所以所有圆弧的部分加起来就是一个园。所以最后围墙的最短周长就是:构造的凸多边形的周长+半径为L的园的周长。
此题题目有点误导人,题意已经指出城堡的顶点以顺时针给出,但实际的数据并不是按序给出的!所以先要自己排好序,再构建凸包。(有点坑爹。。。害我WA了好几次。。。)
AC 代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 #define pi acos(-1) 7 #define eps 1e-8 8 using namespace std; 9 const int N=1005; 10 struct point{ 11 double x,y; 12 }pt[N]; 13 int con[N]; 14 int n,l,tot; 15 double dist(point a,point b){ 16 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 17 } 18 double xmult(point p0,point p1,point p2){ 19 double x1=p1.x-p0.x; 20 double y1=p1.y-p0.y; 21 double x2=p2.x-p0.x; 22 double y2=p2.y-p0.y; 23 return (x1*y2-x2*y1); 24 } 25 bool cmp(point a,point b){ 26 if(xmult(pt[0],a,b)>0||xmult(pt[0],a,b)==0&&(dist(a,pt[0])<dist(b,pt[0])))return true; 27 return false; 28 } 29 void graham(){ 30 sort(pt+1,pt+n,cmp); 31 tot=0; 32 con[tot++]=0; 33 con[tot++]=1; 34 for(int i=2;i<n;){ 35 if(tot<1||xmult(pt[con[tot-2]],pt[con[tot-1]],pt[i])>=0) 36 con[tot++]=i++; 37 else tot--; 38 } 39 con[tot]=0; 40 } 41 int main() 42 { 43 //freopen("in.txt","r",stdin); 44 int i,k; 45 double ans; 46 while(scanf("%d %d",&n,&l)!=EOF){ 47 k=n-1; 48 for(i=n-1;i>=0;i--){ 49 scanf("%lf %lf",&pt[i].x,&pt[i].y); 50 if(pt[i].y<pt[k].y||((pt[i].y==pt[k].y)&&(pt[i].x<pt[k].x))) 51 k=i; 52 } 53 if(k){ 54 swap(pt[0].x,pt[k].x); 55 swap(pt[0].y,pt[k].y); 56 } 57 graham(); 58 ans=0; 59 for(i=0;i<tot;i++) 60 ans+=dist(pt[con[i]],pt[con[i+1]]); 61 ans+=2*pi*l; 62 printf("%d\n",(int)(ans+0.5)); 63 } 64 return 0; 65 }
转载于:https://www.cnblogs.com/acmer-roney/archive/2012/09/04/2670534.html
wall poj 1113相关推荐
- poj 1113 Wall 凸包的应用
题目链接:poj 1113 单调链凸包小结 题解:本题用到的依然是凸包来求,最短的周长,只是多加了一个圆的长度而已,套用模板,就能搞定: AC代码: 1 #include<iostream& ...
- POJ 1113 Wall 求凸包
http://poj.org/problem?id=1113 不多说...凸包网上解法很多,这个是用graham的极角排序,也就是算导上的那个解法 其实其他方法随便乱搞都行...我只是测一下模板... ...
- 凸包 poj 1113
求一个多边形 拐弯的地方用圆弧补上 距离>=l 求他的周长 求一个凸包的周长 加2*pi*l #include<stdio.h> #include<string.h> ...
- poj 1113/3348 凸包(若干点外建围墙)
题意:通过坐标给定若干城堡,要在城堡外建立一个围墙,要求任意城堡到围墙的最小距离不少于一个整数r.求围墙的最小长度. 思路:答案为城堡的凸包长加上以r为半径的元周长.因为圆周的圆心角大小之和为n*18 ...
- POJ 计算几何入门题目推荐
其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专 ...
- [Z]POJ 计算几何入门题目推荐[转PKKJ]
http://www.cnblogs.com/eric-blog/archive/2011/05/31/2064785.html http://hi.baidu.com/novosbirsk/blog ...
- poj计算几何题推荐
POJ 计算几何入门题目推荐(转) 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...
- poj 计算几何 分类
转自novosbirsk的空间,上面还有很多有用的东西. 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组 ...
- POJ 计算几何入门题目推荐(转)
POJ 计算几何入门题目推荐(转) 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...
最新文章
- mybatis 源码分析, 初始化
- Golang 数组传参
- 计算机在线考试系统的参考文献,基于JSP的在线考试系统
- sqlserver中时间格式的字符串传递时的注意事项
- 《Oracle大型数据库在AIX UNIX上的实战详解》的集中答疑九 数据库字符集与国家语言...
- OCA第2部分中的Java难题
- (计算机组成原理)第五章中央处理器-第四节3:微指令的设计
- C语言 · 十六进制转十进制
- 大型网站架构系列:20本技术书籍推荐
- HTML—讲解分割线标签、文字居中、背景图片充满全图
- 51NOD 1244 莫比乌斯函数之和
- Bushound数据分析及使用指南
- C语言:51单片机看这一篇就够了
- 【OpenBMC 系列】3.bitbake介绍
- 第二次作业:软件人才社会需求现状及发展趋势分析
- mac brew的安装方法
- STM32驱动0.96寸OLED屏幕
- CentOS7防火墙配置,重启
- Altium常用元件库,制作原理图使用,共1844个文件,500M+
- 芯片设计中的latch_为什么ICG Cell中使用锁存器(Latch),而不使用触发器(Flip Flop)?...
热门文章
- python参数传递_python中的*和**参数传递机制
- 局域网流量控制_基于软件定义的网络准入控制体系
- java 方法继承方法_Java继承和方法重写
- java中junit_【Java】Junit快速入门
- php代码文本型怎么更改成数值型,php 怎么将字符转成数字
- dataloader 源码_pytorch :: Dataloader中的迭代器和生成器应用
- mtk处理器和骁龙对比_下一代手机处理器谁主沉浮
- SDOI2020游记
- dmx512协议c语言编程,DMX512协议+c程序代码.pdf
- oracle的释放机制,Oracle连接数过多释放机制