大意:给定从原点出发到一些点,注意所给定的点并不是坐标而是结合上一步的位置应该移动到的位置。求出多边形上的点,内部的点,以及多边形的面积。
思路:多边形上的点的个数,可以用GCD(x,y)求出(x,y指的是当的移动量),多边形的面积可以用叉积计算,即从多边形上一个点开始,按照一定的方向移动(即向量的乘积我们要的是三角形的面积求出是平行四边形的面积所以要除以二)。最后用pick定理S=num边/2-1+num内
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
#include<stack>
#include<iostream>
#include<cstring>
#include<algorithm>
#define inf 0x3f3f3f3f
#define eps 1e-8
#define mod 1000000007
#define ls l,mid,rt<<1
#define rs mid+1,rt,rt<<1|1
#define LL __int64
using namespace std;
struct node{
int x,y;
}q[1010];
int GCD(int a,int b){
return b==0?a:GCD(b,a%b);
}
double area(int a,int b,int x,int y){
return x*b - y*a;
}
int main(){
int n,m,i,j,k,cla,aa,bb;
scanf("%d",&cla);
for(int zu = 1;zu <= cla ;++zu){
scanf("%d",&n);
int num1,num2;
double s=0;
num1=num2=0;
q[0].x=q[0].y=0;
for(i = 1;i <= n;++ i){
scanf("%d%d",&aa,&bb);
q[i].x = q[i-1].x + aa;
q[i].y = q[i-1].y + bb;
num1 += GCD(abs(aa),abs(bb));
s += (double)area(q[i].x,q[i].y,q[i-1].x,q[i-1].y)*1.0;
}
printf("Scenario #%d:\n",zu);
num2=-num1/2+1+(int )s/2;
printf("%d %d %.1f\n\n",num2,num1,s*1.0/2.0);
}
return 0;
}