bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘

本文介绍了一个使用格拉汉姆扫描算法寻找凸包的C++程序实例。该算法首先选择集合中Y坐标最小的点作为起始点,接着按极角排序其它点,并通过栈结构依次加入点构建凸包。文中提供了完整的代码实现及输入输出示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同上(什么都不用改)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<map>
 6 #define N 100005
 7 #define eps 1e-8
 8 using namespace std;
 9 int top,n;
10 double ans;
11 struct point{double x,y;}p[N],s[N];
12 inline double dis(point a, point b)
13 {
14     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
15 }
16 inline double cross(point p1, point p2, point p0)
17 {
18     return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
19 }
20 inline bool cmp(point a, point b)
21 {
22     if (cross(a,b,p[0])==0) return dis(a,p[0])<dis(b,p[0]);
23     return cross(a,b,p[0])>0;
24 } 
25 void Graham()
26 {
27     int k=0; top=2;
28     for (int i=1; i<n; i++) 
29         if (p[k].y>p[i].y || (p[i].y==p[k].y && p[k].x>p[i].x)) k=i;
30     point t=p[0]; p[0]=p[k]; p[k]=t;
31     sort(p+1,p+n,cmp);
32     s[0]=p[0]; s[1]=p[1]; s[2]=p[2];
33     for (int i=3; i<n; i++)
34     {
35         while (top && cross(p[i],s[top],s[top-1])>=0) top--;
36         s[++top]=p[i];
37     }
38     s[++top]=p[0];
39     for (int i=0; i<top; i++)
40         ans+=dis(s[i],s[i+1]);
41 }
42 int main()
43 {
44     scanf("%d",&n);
45     for (int i=0; i<n; i++) 
46         scanf("%lf%lf",&p[i].x,&p[i].y);
47     Graham();
48     printf("%.2lf",ans);
49     return 0;
50 }

 

转载于:https://www.cnblogs.com/ccd2333/p/6480891.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值