POJ 1113 Wall 凸包求周长
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 26286 | Accepted: 8760 |
Description
Your task is to help poor Architect to save his head, by writing a program that will find the minimum possible length of the wall that he could build around the castle to satisfy King's requirements.
The task is somewhat simplified by the fact, that the King's castle has a polygonal shape and is situated on a flat ground. The Architect has already established a Cartesian coordinate system and has precisely measured the coordinates of all castle's vertices in feet.
Input
Next N lines describe coordinates of castle's vertices in a clockwise order. Each line contains two integer numbers Xi and Yi separated by a space (-10000 <= Xi, Yi <= 10000) that represent the coordinates of ith vertex. All vertices are different and the sides of the castle do not intersect anywhere except for vertices.
Output
Sample Input
9 100
200 400
300 400
300 300
400 300
400 400
500 400
500 200
350 200
200 200
Sample Output
1628
Hint
题目大意:
有一个贪心的国王,他要你的朋友帮他围着他的城堡砌墙,然而他要求你的墙总是隔他的城堡L的距离,并且要求你使用的墙面长度(周长)最小,不然就砍了你朋友。输入给出N个点的坐标构成这个城堡,给出距离L。
解题思路:
大家可以动手画一画给出的样例(很快就画完了)。发现当点 i 和 i+1 和 i+2 是一条直线的时候,也就是两条线段中间不转弯的情况下,我们的周长直接加线段长就好了。但是如果中间出现了转交,那么有两种情况。让我们看看下面的图:
从图中可以看出,如果出现了这样的两个角,那么还不如我们直接砌直线。所以我们可以得出我们构造的最短周长,应该是构造一个凸包。我们的周长就是所有的直线长度加上转角的特殊弧长。弧长怎么算呢?细心一点就知道每个转角对应的圆心角应该是π-内角(我们作城堡直线路径的垂线看看!)。
由此我们再加上这些弧长就是我们的答案了!
代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define eps 10e-9
#define MAX 1002 struct Point
{
double x,y;
Point() {}
Point ( double x , double y ) : x(x) , y(y) {}
};
typedef Point Vector;
Point operator - ( Point a , Point b ) { return Point ( a.x - b.x , a.y - b.y ); } bool cmp ( Point a, Point b )
{
if ( a.x != b.x ) return a.x < b.x;
else return a.y < b.y;
} double Length ( Vector v )
{
return sqrt ( v.x * v.x + v.y * v.y );
} double Dot ( Vector u , Vector v )
{
return u.x * v.x + u.y * v.y;
} int dcmp ( double x )
{
if ( fabs ( x ) < eps ) return 0;
else return x < 0 ? -1 : 1 ;
} double Distance ( Point a , Point b )
{
return sqrt ( ( a.x - b.x ) * ( a.x - b.x ) + ( a.y - b.y ) * ( a.y - b.y ) );
} double Cross ( Vector u , Vector v )
{
return u.x * v.y - u.y * v.x;
} double Angle ( Vector u , Vector v ) { return acos ( Dot ( u , v ) / Length ( u ) / Length ( v ) ); } int ConvexHull ( Point *p , int n , Point *ch ) //求凸包
{
int m = 0;
sort ( p , p + n , cmp );
for ( int i = 0 ; i < n ; i ++ )
{
while ( m > 1 && Cross ( ch[m-1] - ch[m-2] , p[i] - ch[m-2] ) <= 0 ) m --;
ch[m++] = p[i];
}
int k = m;
for ( int i = n - 2 ; i >= 0 ; i -- )
{
while ( m > k && Cross ( ch[m-1] - ch[m-2] , p[i] - ch[m-2] ) <= 0 ) m-- ;
ch[m++] = p[i];
}
if ( n > 1 ) m --;
return m;
} int main()
{
int n,l;
Point cas[MAX],ch[MAX];
scanf ( "%d %d" , &n , &l );
for ( int i = 0 ; i < n ; i ++ )
scanf ( "%lf %lf" , &cas[i].x , &cas[i].y );
int cnt = ConvexHull ( cas , n , ch );
double ans = 0;
for ( int i = 0 ; i < cnt ; i ++ )
ans += Distance ( ch[(i+1)%cnt] , ch[i] );
for ( int i = 0 ; i < cnt ; i ++ )
{
double ang = Angle ( ch[(i+2)%cnt] - ch[(i+1)%cnt] , ch[(i+1)%cnt] - ch[i] );
if ( dcmp ( ang ) != 0 )
{
ans += ang * l;
}
}
if ( ans - (int)ans - 0.5 > 0 )
printf ( "%d\n" , (int) ans + 1 );
else printf ( "%d\n" , (int)ans );
return 0;
}
技巧总结:
凸包在计算几何中占有很重要的地位!
POJ 1113 Wall 凸包求周长的更多相关文章
- POJ 1113 Wall 凸包 裸
LINK 题意:给出一个简单几何,问与其边距离长为L的几何图形的周长. 思路:求一个几何图形的最小外接几何,就是求凸包,距离为L相当于再多增加上一个圆的周长(因为只有四个角).看了黑书使用graham ...
- poj 1113 Wall 凸包的应用
题目链接:poj 1113 单调链凸包小结 题解:本题用到的依然是凸包来求,最短的周长,只是多加了一个圆的长度而已,套用模板,就能搞定: AC代码: #include<iostream> ...
- poj 1113 wall(凸包裸题)(记住求线段距离的时候是点积,点积是cos)
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 43274 Accepted: 14716 Descriptio ...
- POJ 1113 - Wall 凸包
此题为凸包问题模板题,题目中所给点均为整点,考虑到数据范围问题求norm()时先转换成double了,把norm()那句改成<vector>压栈即可求得凸包. 初次提交被坑得很惨,在GDB ...
- TZOJ 2569 Wooden Fence(凸包求周长)
描述 Did you ever wonder what happens to your money when you deposit them to a bank account? All banks ...
- poj 1113:Wall(计算几何,求凸包周长)
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28462 Accepted: 9498 Description ...
- POJ 1113 Wall(凸包)
[题目链接] http://poj.org/problem?id=1113 [题目大意] 给出一个城堡,要求求出距城堡距离大于L的地方建围墙将城堡围起来求所要围墙的长度 [题解] 画图易得答案为凸包的 ...
- POJ 1113 Wall (凸包)
Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...
- 2018.07.04 POJ 1113 Wall(凸包)
Wall Time Limit: 1000MS Memory Limit: 10000K Description Once upon a time there was a greedy King wh ...
随机推荐
- uploadify 上传文件出现HTTP 404错误
今天在使用jquery.uploadify.js上传文件的时候,出现HTTP 404错误,此错误在上传较小文件时不会出现,在上传一个50M左右文件时出现此错误,经过测试和日志查看发现,根本没有进入后台 ...
- javascript 节点属性详解
javascript 节点属性详解 根据 DOM,html 文档中的每个成分都是一个节点 DOM 是这样规定的:整个文档是一个文档节点每个 html 标签是一个元素节点包含在于 html 元素中的文本 ...
- SQL 添加字段和默认值脚本
--插入字段和默认值alter table Acc_WayBill add DeclaredValue nvarchar(50)goEXEC sys.sp_addextendedproperty @n ...
- python之PIL安装问题
··在windows安装模块 总是出现问题,今天安装PIL的 首先提示我的是pip命令出错,这应该是当你安装Python2.7的时候 并没有把pip模块添加进去 导致出现了这样的一个问题,为了省事,我 ...
- 【python】元组的插入
>>> temp=(1,2,3,4,5)>>> temp=temp[:2]+(8,)+temp[2:]>>> temp(1, 2, 8, 3, 4 ...
- REST API之前端跨域访问
关键字:跨域访问,cross-origin, NodeJS, REST API, JavaScript, Access-Control-Allow-Origin 1.新建并运行一个 NodeJS的se ...
- QTcpsocket 实现FTP
http://blog.163.com/modingfa_002/blog/static/1109254662013111510358109/ http://baike.baidu.com/link? ...
- Keil的c语言编译器
我曾经通过查看反汇编代码对KEILC编译器进行了测试,大概有这么一下内容,也得出一些结论. (1)全局变量:如果程序中定义了全局变量,而且初始值不是0.此时,在程序调到main()函数执行前,除了要进 ...
- Windows使用Apache2配置Git服务器
Windows使用Apache2配置Git服务器 本文地址:http://www.cnblogs.com/cnscoo/p/3373095.html Git下载: 网站:https://code.go ...
- asp.net中Timer定时器在web中无刷新的使用
最近在做一个项目的时候,web端的数据需要与数据源进行实时同步,并保证数据的准确性,当时,考虑到使用ajax异步刷新技术.但后来在网上查找相关资料时,发现这样做,太浪费资源了,因为ajax的提交请求不 ...