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(double x=0,double y=0):x(x),y(y) {}

    P operator + (P o) { return P(x+o.x,y+o.y); }
    P operator - (P o) { return P(x-o.x,y-o.y); }

    bool operator == (const P &o) const {
        return x==o.x && y==o.y;
    }
    bool operator < (const P &o) const {
        return x<o.x || (x==o.x && y<o.y);
    }

};

P ans[maxn],p[maxn];

inline double cross(P a,P b) { return a.x*b.y-a.y*b.x; }

inline double dist(P o) { return sqrt(o.x*o.x+o.y*o.y); }

double convexHull(int n) {

    sort(p,p+n);

    int m=0;
    rep(i,n) {
        while(m>1 && cross(ans[m-1]-ans[m-2],p[i]-ans[m-2])<=0) m--;
        ans[m++]=p[i];
    }

    int k=m;
    for(int i=n-2;i>=0;i--) {
        while(m>k && cross(ans[m-1]-ans[m-2],p[i]-ans[m-2])<=0) m--;
        ans[m++]=p[i];
    }

    if(n>1) m--;

    double length=0;
    rep(i,m) length+=dist(ans[i]-ans[i+1]);

    return length;

}

int main()
{
    freopen("fc.in","r",stdin); freopen("fc.out","w",stdout);

    int n;
    cin>>n;
    rep(i,n) scanf("%lf%lf",&p[i].x,&p[i].y);
    printf("%.2lf\n",convexHull(n));

    return 0;
}

时间: 2024-11-02 01:23:14

USACO Section 5.1 Fencing the Cows(凸包)的相关文章

【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

USACO Section 2.1 Healthy Holsteins

/* ID: lucien23 PROG: holstein LANG: C++ */ #include <iostream> #include <fstream> #include <vector> using namespace std; bool compFun(int x, int y) { int temp, i = 0; while (true) { temp = 1 << i; if (temp&x > temp&y) {

USACO Section 2.2 Party Lamps

/* ID: lucien23 PROG: lamps LANG: C++ */ /* * 此题的技巧之处就是需要注意到任何button只要按下2的倍数次就相当于没有按 * 所以其实只需要考虑4个按钮,每个按钮是否被有效按下过一次就好 * 直接使用枚举法,一共只有2^4=16种情况 * 对于每种情况需要知道被按下的有效次数(也就是被按下过的按钮数),必须满足 * (C-有效次数)%2=0才行,这样其他次数才能视为无效 * 然后验证各种情况是否符合要求,将符合要求的情况按序输出即可 */ #inc

USACO Section 2.2 Runaround Numbers

/* ID: lucien23 PROG: runround LANG: C++ */ #include <iostream> #include <fstream> #include <cstring> using namespace std; int main() { ifstream infile("runround.in"); ofstream outfile("runround.out"); if(!infile || !

USACO Section 2.2 Preface Numbering

/* ID: lucien23 PROG: preface LANG: C++ */ #include <iostream> #include <fstream> #include <string> #include <map> using namespace std; int main() { ifstream infile("preface.in"); ofstream outfile("preface.out")

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 Section 1.2PROB Miking Cows

贪心做过去,先对每个时间的左边点进行排序,然后乱搞,当然线段树也可以做 /* ID: jusonal1 PROG: milk2 LANG: C++ */ #include <iostream> #include <fstream> #include <string> #include <cstdio> #include <algorithm> #include <map> #include <cstring> using

洛谷 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.N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目.接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <= 1,000,000).数字用小数表示. 输出格式