凸包(hd1392)

Surround the Trees

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8996    Accepted Submission(s):
3457
点我

Problem Description

There are a lot of trees in an area. A peasant wants to
buy a rope to surround all these trees. So at first he must know the minimal
required length of the rope. However, he does not know how to calculate it. Can
you help him?
The diameter and length of the trees are omitted, which means
a tree can be seen as a point. The thickness of the rope is also omitted which
means a rope can be seen as a line.

There are no more
than 100 trees.

Input

The input contains one or more data sets. At first line
of each input data set is number of trees in this data set, it is followed by
series of coordinates of the trees. Each coordinate is a positive integer pair,
and each integer is less than 32767. Each pair is separated by
blank.

Zero at line for number of trees terminates the input for your
program.

Output

The minimal length of the rope. The precision should be
10^-2.

Sample Input

9

12 7

24 9

30 5

41 9

80 7

50 87

22 9

45 1

50 7

0

Sample Output

243.06

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 #include <cstdio>
 5 #include <cstring>
 6 using namespace std;
 7 struct point
 8 {
 9     int x,y;
10 }list[100];
11 int stack[100];
12 int cross(point p0,point p1,point p2)
13 {
14     return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
15 }
16 double dis(point p1,point p2)
17 {
18     return sqrt(double(p2.x-p1.x)*(p2.x-p1.x)+double(p2.y-p1.y)*(p2.y-p1.y));
19 }
20 bool cmp(point p1,point p2)
21 {
22     int tem=cross(list[0],p1,p2);
23     if(tem>0)
24         return 1;
25     else if(tem==0&&dis(list[0],p1)<dis(list[0],p2))
26         return 1;
27     else
28         return 0;
29 }
30 void init(int n)
31 {
32     int i,k;
33     point p0;
34     cin>>list[0].x>>list[0].y;
35     for(i=1;i<n;i++)
36     {
37         cin>>list[i].x>>list[i].y;
38         if(list[i].y<list[0].y||(list[i].y==list[0].y&&list[i].x<list[0].x))
39         {
40             p0=list[0];
41             list[0]=list[i];
42             list[i]=p0;
43         }
44     }
45     sort(list+1,list+n,cmp);
46 }
47 int main()
48 {
49     int i,n;
50     //freopen("in.txt","r",stdin);
51     while(cin>>n&&n)
52     {
53         memset(list,0,sizeof(list));
54         memset(stack,0,sizeof(stack));
55         if(n==1)
56             cout<<0.00<<endl;
57         else if(n==2)
58         {
59             cin>>list[0].x>>list[0].y>>list[1].x>>list[1].y;
60             printf("%0.2f\n",dis(list[0],list[1]));
61         }
62         else
63         {
64             stack[0]=0;
65             stack[1]=1;
66             int top=1;
67             init(n);
68             for(i=2;i<n;i++)
69             {
70                 while(top>0&&cross(list[stack[top]],list[stack[top-1]],list[i])>0)
71                     top--;
72                 top++;
73                 stack[top]=i;
74             }
75             double sum=0;
76             for(i=1;i<=top;i++)
77             {
78                 sum+=dis(list[stack[i]],list[stack[i-1]]);
79             }
80             sum+=dis(list[0],list[stack[top]]);
81             printf("%0.2f\n",sum);
82             }
83         }
84 }
时间: 2024-07-29 16:07:41

凸包(hd1392)的相关文章

POJ3528 HDU3662 三维凸包模板

POJ3528 HDU3662 第一道题 给定若干点 求凸包的表面积,第二题 给定若干点就凸包的面数. 简单说一下三维凸包的求法,首先对于4个点假设不共面,确定了唯一四面体,对于一个新的点,若它不在四面体内,为了让它进入凸包, 则对于所有凸包上的边,若边的一面是该点可以看到的而另一面看不到,则该点与该边构成的面要加入凸包. 模板代码非常清晰, #include<stdio.h> #include<algorithm> #include<string.h> #includ

关于2016.12.12——T1的反思:凸包的意义与应用

2016.12.12 T1 给n个圆,保证圆圆相离,求将圆围起来的最小周长.n<=100 就像上图.考场上,我就想用切线的角度来做凸包.以圆心x,y排序,像点凸包一样,不过用两圆之间的下切线角度来判断. 这就是下切线(我自己瞎编的名字): 好像是对的啊: 然后我就保证必AC的希望,用这种写法交了,然后就只得了N=2的暴力分... 自以为是正解,却落得如此下场... 为什么?这样不对吗?借用学长的力量,果然被Hack掉了: 这种情况,圆心排序后,检测的顺序并不是圆上的切点的顺序,自然就会挂. 蓝瘦

poj 1113 凸包周长

Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33888   Accepted: 11544 Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall around the King's castle. The King was so greedy, that he w

UVA 11800 Determine the Shape --凸包第一题

题意: 给四个点,判断四边形的形状.可能是正方形,矩形,菱形,平行四边形,梯形或普通四边形. 解法: 开始还在纠结怎么将四个点按序排好,如果直接处理的话,有点麻烦,原来凸包就可搞,直接求个凸包,然后点就自动按逆时针排好了,然后就判断就可以了,判断依据题目下面有,主要是用到点积和叉积,判断垂直用点积,判断平行用叉积. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cstd

POJ 3348 最直接的凸包问题

题目大意: 给定一堆树的点,找到能组合成的最大面积,一个物体占50面积,求最多放多少物体 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 const double eps = 1e-10; 7 const int N = 10005; 8 double myabs(double x) 9

hdu 1348 Wall(凸包模板题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1348 Wall Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3386    Accepted Submission(s): 968 Problem Description Once upon a time there was a gre

POJ1113 Wall【凸包】

Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24604   Accepted: 8183 Description King想在自己的n个城堡外建Wall,使Wall与任一城堡距离至少为L且能围住它的城堡. 求Wall最短长度. Input 第一行为 N (3 <= N <= 1000) 和 L(1 <= L <= 1000). 接下来 N 行,每行为城堡坐标Xi,Yi (-10000 <=

[凸包]Triangles

https://nanti.jisuanke.com/t/15429 题目大意:给出平面内$n$个整数坐标点,保证无三点共线.可以进行若干次连线,每次选择一个点对连接线段,但是任意两条线段都不得在给定的$n$个点之外有交点.问连线完成后,最多能构造出多少个三角形. 解题关键: 小于三个点的情况答案为零.考虑三个点的情况,由于三点不共线,必然构成一个三角形.现加入第四个点,若其在原三角形外部,则称其为外点,可以新构造$1$个三角形:若其在原三角形内部,则称其为内点,可以新构造$3$个三角形.故要尽

ZOJ - 3537 Cake (凸包+区间DP+最优三角剖分)

Description You want to hold a party. Here's a polygon-shaped cake on the table. You'd like to cut the cake into several triangle-shaped parts for the invited comers. You have a knife to cut. The trace of each cut is a line segment, whose two endpoin