zoukankan      html  css  js  c++  java
  • POJ2954pick定理+GCD···

    POJ2954----pick定理+GCD···

    链接:http://poj.org/problem?id=2954

    PICK定理,一个很重要也很方便的定理:

    在一个平面直角坐标系内,以整点为顶点的简单多边形(任两边不交叉),它内部整点数为a,它的边上(包括顶点)的整点数为b,则它的面积S = a+b/2-1.

    具体证明就不说了,也不难。。

    这道题再加上多边形的整点的关系什么的,反正就是用GCD求了。。面积依然直接叉积,不过要注意取绝对值。

     1 //poj-2954
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cmath>
     5 #define eps 1e-8
     6 using namespace std;
     7 
     8 struct point
     9 {
    10     int x;int y;
    11 };
    12 
    13 double are(point p1,point p2,point p3)
    14 {
    15         return ((p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x));
    16 }
    17 int gcd(int a,int b)
    18 {
    19     if(b==0) return a;
    20     else return gcd(b,a%b);
    21 }
    22 int abss(int a)
    23 {
    24     return a>0?a:-a;
    25 }
    26 
    27 int main()
    28 {
    29     point p1,p2,p3;
    30     while(scanf("%d%d%d%d%d%d",&p1.x,&p1.y,&p2.x,&p2.y,&p3.x,&p3.y) == 6
    31         && p1.x||p1.y||p2.x||p2.y||p3.x||p3.y)
    32     {
    33         double area= abss(are(p1,p2,p3))/2.0;
    34         double bb=0;              //
    35         bb+=gcd(abss(p1.x - p2.x) , abss(p1.y - p2.y));
    36         bb+=gcd(abss(p2.x - p3.x) , abss(p2.y - p3.y));
    37         bb+=gcd(abss(p1.x - p3.x) , abss(p1.y - p3.y));
    38         double b= bb/2.0 - 1.0;
    39         int ans=int(area -b);
    40         printf("%d\n",ans);
    41     }
    42     return 0;
    43 }
  • 相关阅读:
    [国家集训队]数颜色 / 维护队列(带修莫队)
    最大流(三)—— Dinic算法
    最大流(二)—— SAP算法
    最大流(一)—— Edmond-Karp算法
    Arhus University 2000
    USACO 2005 December Gold
    USACO 2004 February
    欧拉函数模版
    最小树形图模板
    线段树模板
  • 原文地址:https://www.cnblogs.com/xdruid/p/2609253.html
Copyright © 2011-2022 走看看