pick定理:面积=内部点数+边上点数/2 -1;
开始做的时候脑袋发昏,敲了一个小时的模版,枚举点判断与多边形位置,果断TLE
等脑子清醒了,多画了几个图,数了几次点,就A了。。
//Memory: 180K //Time: 0MS #include <stdio.h> #include <math.h> struct POINT { int x,y; };POINT p[110]; int gcd(int a,int b) { if(b==0) return a; return gcd(b,a%b); } double area_of_polygon(int n)//多边形面积 { int i; double s; // if(n<3) // return 0; s=p[0].y*(p[n-1].x-p[1].x); for(i=1;i<n;i++) s+=p[i].y*(p[i-1].x-p[(i+1)%n].x); return s/2; } int main() { int cas,i,j,n; scanf("%d",&cas); for(int f=1;f<=cas;f++) { scanf("%d",&n); p[0].x=0; p[0].y=0; int dx,dy,on=0,in=0; for(i=1;i<=n;i++) { scanf("%d%d",&dx,&dy); p[i].x=p[i-1].x+dx; p[i].y=p[i-1].y+dy; if(dx==0 || dy==0) on+=abs(dx+dy); else on+=gcd(abs(dx),abs(dy)); } double area=area_of_polygon(n); in=area+1-on*1.0/2; printf("Scenario #%d:\n",f); printf("%d %d %.1lf\n\n",in,on,area); } return 0; }