POJ Area 1265(pick定理)

大意:给定从原点出发到一些点,注意所给定的点并不是坐标而是结合上一步的位置应该移动到的位置。求出多边形上的点,内部的点,以及多边形的面积。

思路:多边形上的点的个数,可以用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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值