国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【POJ1113】Wall-Graham-Scan算法求凸包

2019-11-08 02:55:06
字體:
來源:轉載
供稿:網友

測試地址:Wall

題目大意:一個國王有n個城堡(可以看做平面上的點),現在要建一堵封閉的城墻將所有城堡圍住,并且使得城墻與每座城堡的最短距離不超過L,求滿足條件的最短城墻長度。

做法:可以證明,最短城墻長度等于這n個點的凸包周長加上一個半徑為L的圓的周長,所以問題就轉變為求這n個點的凸包,這里用基于極角排序的Graham-Scan算法來求凸包,時間復雜度為O(nlogn)。輸出要注意,如果選C++就是%.0lf,如果選G++就是%.0f,否則會WA,我也不知道為什么......

以下是本人代碼:

#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>#include <cmath>#define pi 3.14159265#define e 0.00000001using namespace std;int n,s[1010],top=1;double l,ans=0;struct point{  double x,y;  point Operator - (point b)  {    point s;	s.x=x-b.x;	s.y=y-b.y;	return s;  }}p[1010];double multi(point a,point b){  return a.x*b.y-b.x*a.y;}double dist(point a,point b){  return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}bool cmp(point a,point b){  if (a.x!=b.x) return a.x<b.x;  return a.y<b.y;}bool cmp2(point a,point b){  double m=multi(a-p[1],b-p[1]);  if (fabs(m)<=e) return dist(a,p[1])<dist(b,p[1]);  return m>0;}void graham(){  top=2,s[1]=1,s[2]=2;  for(int i=3;i<=n;i++)  {    while(top>1&&multi(p[s[top]]-p[s[top-1]],p[i]-p[s[top]])<=0) top--;	s[++top]=i;  }}int main(){  scanf("%d%lf",&n,&l);  for(int i=1;i<=n;i++)    scanf("%lf%lf",&p[i].x,&p[i].y);    sort(p+1,p+n+1,cmp);  sort(p+2,p+n+1,cmp2);  graham();    for(int i=1;i<top;i++)    ans+=dist(p[s[i]],p[s[i+1]]);  ans+=dist(p[1],p[s[top]]);  ans+=pi*2*l;    PRintf("%.0f",ans);    return 0;}


上一篇:IO庫

下一篇:USACO 2.1.1 Castle

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临漳县| 社旗县| 临颍县| 兴海县| 普兰县| 金坛市| 福安市| 罗甸县| 始兴县| 临邑县| 蓬莱市| 曲阜市| 如皋市| 乌鲁木齐县| 五莲县| 克东县| 通江县| 灵璧县| 张北县| 克东县| 东丰县| 濮阳县| 耒阳市| 盱眙县| 海城市| 磐安县| 仙游县| 诸暨市| 普洱| 皮山县| 五寨县| 仙居县| 福建省| 普兰店市| 喀什市| 辽中县| 临清市| 昌黎县| 同德县| 永仁县| 佛学|