cogs896 圈奶牛

Posted SilverNebula

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cogs896 圈奶牛相关的知识,希望对你有一定的参考价值。

 

描述

农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度。

PROGRAM NAME: fc

INPUT FORMAT(file fc.in)

输入数据的第一行包括一个整数 N。N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目。接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <= 1,000,000)。数字用小数表示。

OUTPUT FORMAT(file fc.out)

输出必须包括一个实数,表示必须的围栏的长度。答案保留两位小数。

SAMPLE INPUT (file fc.in)

4
4 8
4 12
5 9.3
7 8 

SAMPLE OUTPUT (file fc.out)

12.00




graham凸包算法
注意读进来的有小数
 1 /*by SilverN*/
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<algorithm>
 7 #define ll long long
 8 using namespace std;
 9 const int mxn=20000;
10 struct node{
11     double x,y;
12 }p[mxn],s[mxn];
13 int top;
14 double ans;
15 int n;
16 inline node operator -(node a,node b){
17     node T;    T.x=a.x-b.x;    T.y=a.y-b.y;    return T;
18 }
19 inline double operator *(node a,node b){
20     return a.x*b.y-a.y*b.x;
21 }
22 inline double dis(node a,node b){
23     return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
24 }
25 inline bool operator < (node a,node b){
26     ll t=(a-p[1])*(b-p[1]);
27     if(t==0)return dis(a,p[1])<dis(b,p[1]);
28     return t>0;
29 }
30 void graham(){
31     int i,j;
32     int t=1;
33     for(i=2;i<=n;i++){
34         if(p[i].y<p[t].y || (p[i].y==p[t].y && p[i].x<p[t].x))t=i;
35     }
36     swap(p[1],p[t]);
37     sort(p+2,p+n+1);
38     s[1]=p[1];
39     s[2]=p[2];top=2;
40     for(i=3;i<=n;i++){
41         while(top && ((s[top]-s[top-1])*(p[i]-s[top-1]))<0 )top--;
42         s[++top]=p[i];
43     }
44     s[top+1]=p[1];
45     for(i=1;i<=top;i++){
46         ans+=sqrt(dis(s[i],s[i+1]));
47     }
48     return;
49 }
50 int main(){
51 //    freopen("fc.in","r",stdin);
52 //    freopen("fc.out","w",stdout);
53     scanf("%d",&n);
54     int i,j;
55     for(i=1;i<=n;i++){
56         scanf("%lf%lf",&p[i].x,&p[i].y);
57     }
58     graham();
59     printf("%.2lf\n",ans);
60     return 0;
61 }

 

以上是关于cogs896 圈奶牛的主要内容,如果未能解决你的问题,请参考以下文章

cogs896 圈奶牛

COGS 896. 圈奶牛

COGS [USACO Mar07] 奶牛交通

cogs 141. [USACO Jan08] 奶牛的选举

cogs 1945. 奶牛跑步

COGS130. [USACO Mar08] 游荡的奶牛[DP]