POJ 3348 Cows (凸包+多边形面积)

http://poj.org/problem?id=3348

大意:用已有的树围成最大的牧场来养牛,每头牛生活至少需要50平方米。求出能养多少头?

听说此题不难,然而我因为打错了一个变量看了一晚上(外加一早上T_T)。大致思路是:用凸包确定能构造的最大多边形,然后求解凸包多边形的面积。

耻辱句:最后求面积的:

for(int i=2;i<top;i++){
不是:

for(int i=2;i<n;i++){
搞清楚各个变量的含义再写好不,他们是有生命的,水能载舟,亦能覆舟,错杀一命,全局皆输!!!!

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=1e4+10;
struct point {
    int x,y;
}p[N];
int cross(point p0,point p1,point p2){
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int cmp1(point p1,point p2){
    return p1.x<p2.x||(p1.x==p2.x&&p1.y<p2.y);
}
int dis(point p1,point p2){
    return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
}
int cmp2(point p1,point p2){
    int c=cross(p[0],p1,p2);
    if(c==0) return dis(p[0],p1)<dis(p[0],p2);
    return c>0;
}
point ans[N];
int top;
void convex(int n){
    top=0;
    sort(p,p+n,cmp1);
    sort(p+1,p+n,cmp2);
    ans[top++]=p[0];
    ans[top++]=p[1];
    for(int i=2;i<n;i++){
        if(cross(ans[top-2],ans[top-1],p[i])>0) ans[top++]=p[i];
        else {
            top--;
            while(top>=2&&cross(ans[top-2],ans[top-1],p[i])<=0) top--;  //共线或者顺时针均弹出
            ans[top++]=p[i];
        }
    } //最后不用连上p[0];
}
int main()
{
    //freopen("cin.txt","r",stdin);
    int n;
    while(cin>>n){
        for(int i=0;i<n;i++){
            scanf("%d%d",&p[i].x,&p[i].y);
        }
        if(n<3){
            puts("0");
            continue;
        }
        convex(n);
        point t1=ans[1];
        int area=0;
        for(int i=2;i<top;i++){
            area+=cross(ans[0],t1,ans[i]); //myabs(cross(ans[0],t1,ans[i]));
            t1=ans[i];
        }
        printf("%d\n",area/100);
    }
    return 0;
}




你可能感兴趣的:(凸包)