P2742 [USACO5.1]圈奶牛Fencing the Cows

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

4
4 8
4 12
5 9.3
7 8

输出样例#1:

12.00

说明

题目翻译来自NOCOW。

USACO Training Section 5.1

计算几何,确实让人恶心。。。

这题就是一个裸的凸包,

用A什么算法求,

注意一下,

需要开double的不要忘了开double!!!!!!!!!!

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define vec point
 7 using namespace std;
 8 const double eps=1e-8;
 9 const int MAXN=10001;
10 int n;
11 void read(int &n)
12 {
13     char c=‘+‘;int x=0;bool flag=0;
14     while(c<‘0‘||c>‘9‘){c=getchar();if(c==‘-‘)flag=1;}
15     while(c>=‘0‘&&c<=‘9‘){x=x*10+(c-48);c=getchar();}
16     flag==1?n=-x:n=x;
17 }
18 inline int dcmp(double x)
19 {
20     if(fabs(x)<eps)    return 0;
21     else return x>0?1:-1;
22 }
23 struct point
24 {
25     double x,y;
26     inline point(double x=0,double y=0):x(x),y(y){};
27 }p[MAXN],ch[MAXN];
28 vec operator - (vec a,vec b) {return vec(a.x-b.x,a.y-b.y);}
29 vec operator + (vec a,vec b) {return vec(a.x+b.x,a.y+b.y);}
30 vec operator == (vec a,vec b){return (dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0);}
31 int comp(const point &a,const point &b)
32 {
33     if(a.x==b.x)    return a.y<b.y;
34     else    return a.x<b.x;
35 }
36 int stack[MAXN];
37 double cross(vec a,vec b){return a.x*b.y-a.y*b.x;}
38 int convex_hull()
39 {
40     sort(p+1,p+n+1,comp);
41     int top=1;
42     for(int i=1;i<=n;i++)
43     {
44         while(top>2&& dcmp(cross(ch[top-1]-ch[top-2], p[i]-ch[top-2]))<=0)    top--;
45         ch[top++]=p[i];
46     }
47     int tmp=top+1;
48     for(int i=n-1;i>=1;i--)
49     {
50         while(top+1>tmp&& dcmp(cross(ch[top-1]-ch[top-2], p[i]-ch[top-2]))<=0)    top--;
51         ch[top++]=p[i];
52     }
53     if(n>2) top--;
54     return top;
55 }
56 double dis(point a,point b)
57 {
58     return    sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
59 }
60 int main()
61 {
62     //freopen("fc.in","r",stdin);
63     //freopen("fc.out","w",stdout);
64     read(n);
65     //ios::sync_with_stdio(0);
66     for(int i=1;i<=n;i++)
67     {
68         double a,b;
69         cin>>a>>b;
70         p[i]=point(a,b);
71     }
72     int num=convex_hull();
73     double ans=0.0;
74     for(int i=1;i<num;i++)
75         ans+=dis(ch[i],ch[i+1]);
76     ans+=dis(ch[num],ch[1]);
77     printf("%.2lf",ans);
78     return 0;
79 }
时间: 2024-12-15 19:17:15

P2742 [USACO5.1]圈奶牛Fencing the Cows的相关文章

洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows

题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入格式: 输入数据的第一行包括一个整数 N.N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目.接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <= 1,000,000).数字用小数表示. 输出格式

P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows

题意:n个点,求凸包周长.(纯板子QAQ) 定义 凸包:用最小的凸多边形将n个点围在里面的图形为凸包 前置 向量:点积:(a,b) (c,d)=(a*c,b*d) =|(a,b)|*|(c,d)|*cos<(a,b),(c,d)>; 叉积:(a,b) (c,d)=a*d-b*c=|(a,b)|*|(c,d)|*sin<(a,b),(c,d)>;  几何意义:以(a,b)(c,d)两向量作平行四边形,它俩的叉积为其面积 故有三角形面积=$\large{\frac{1}{2}*|(a,

【USACO 5.1.1】Fencing the Cows

Fencing the CowsHal Burch Farmer John wishes to build a fence to contain his cows, but he's a bit short on cash right. Any fence he builds must contain all of the favorite grazing spots for his cows. Given the location of these spots, determine the l

【COGS &amp; USACO】896. 圈奶牛(凸包)

http://cojs.tk/cogs/problem/problem.php?pid=896 我的计算几何入门题... 看了看白书的计算几何部分,,恩好嘛.. 乃们都用向量!!!! 干嘛非要将2个点确定一条线变成一个点从原点o出发的射线!!!! 这就是所谓的玩概念吗 然后用所谓的向量加减,是这些向量起点相同,然后就变成了原点o出发的射线!!! 然后你们还在玩概念!我跪了. (以上纯属蒟蒻吐槽) 好吧,计算几何非常有用的..简化了不少操作. 这里还有啥点积啥叉积.点积就是同一起点的向量(终点)的

cogs896 圈奶牛

描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. PROGRAM NAME: fc INPUT FORMAT(file fc.in) 输入数据的第一行包括一个整数 N.N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目.接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <

COGS 896. 圈奶牛

凸包,,,,,,,神奇的凸包2333 本蒟蒻弱势围观了一下Gamham扫描线法,,, 找出左下点,然后把其他点按极角序排一下(极角序相同的可以删掉短的,当然也可以吧短的排到前面) 然后拿一个栈,把新元素压到栈里之前,看看(设栈顶为top)top,top-1和新加入点是不是符合,然后判断一下是不是top点不能再凸包上,然后while搞下去就好了... 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm>

cogs896 圈奶牛 凸包

链接:http://cogs.pro/cogs/problem/problem.php?pid=896 题意:给出一些点,求出这些点的凸包. 几何第一题留念-- 题意已经很明白了,求出这些点的凸包.题目没有什么可以说的,这里给出两种实现方式,供读者参考. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath&g

USACO Section 5.1 Fencing the Cows(凸包)

裸的凸包..很好写,废话不说,直接贴代码. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #define rep(i,r) for(int i=0;i<r;i++) using namespace std; const int maxn=10000+5; struct P { double x,y; P(do

Records_TEMP19033101

Math 必刷题 6 / 19 一遍过 10 / 17 Physics 必刷题 35 / 47 一遍过 50 / 70 Chemistry 必刷题 0 / 2 一遍过 1 / ? Biology 必刷题 4 / 16 一遍过 0 / 14 OI 2019 March.25 HDU2152Fruit simple generating function HDU1521排列组合 exponential generating function HDU2082找单词 simple generating