1. 程式人生 > >POJ3348:Cows——題解

POJ3348:Cows——題解

pos namespace int -s i++ href bool -a r+

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——題解