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; }