POJ3348:Cows——题解

Posted

tags:

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

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

题目大意:用已给出的点围出面积最大的凸包,输出面积/50(向下取整)

——————————————————————————

第一道凸包?以及不知道第几次的奶牛题……

显然裸题,切了。

(那博文的意义何在?)

(呃……方便以后抄板子?)

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=10001;
struct point{
    int x;
    int y;
}p[N],q[N];
int n,per[N],l;
inline point getmag(point a,point b){
    point s;
    s.x=b.x-a.x;s.y=b.y-a.y;
    return s;
}
inline int multiX(point a,point b){
    return a.x*b.y-b.x*a.y;
}
inline int dis(point a,point b){
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
inline bool cmp(int u,int v){
    int det=multiX(getmag(p[1],p[u]),getmag(p[1],p[v]));
    if(det!=0)return det>0;
    return dis(p[1],p[u])<dis(p[1],p[v]);
}
void graham(){
    int id=1;
    for(int i=2;i<=n;i++){
        if(p[i].x<p[id].x||(p[i].x==p[id].x&&p[i].y<p[id].y))id=i;
    }
    if(id!=1)swap(p[1],p[id]);
    for(int i=1;i<=n;i++)per[i]=i;
    sort(per+2,per+n+1,cmp);
    q[++l]=p[1];
    for(int i=2;i<=n;i++){
        int j=per[i];
        while(l>=2&&multiX(getmag(q[l-1],p[j]),getmag(q[l-1],q[l]))>=0)l--;
        q[++l]=p[j];
    }
    return;
}
inline int area(){
    int ans=0;
    q[0].x=0;q[0].y=0;
    for(int i=1;i<=l;i++){
        ans+=multiX(getmag(q[0],q[i]),getmag(q[0],q[i%l+1]));
    }
    return abs(ans)/2;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y);
    graham();
    int ans=area()/50;
    printf("%d\n",ans);
    return 0;
}

 

以上是关于POJ3348:Cows——题解的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3348 Cows | 凸包模板题

poj3348 Cows

POJ 3348 Cows [凸包 面积]

POJ 3348 Cows (凸包模板+凸包面积)

POJ 3348 - Cows 凸包面积

POJ 3348 Cows 凸包 求面积

(c)2006-2024 SYSTEM All Rights Reserved IT常识