zoukankan      html  css  js  c++  java
  • POJ3348——Cows(求凸包)

    快乐老家

    什么废话都不用说了吧,直接graham求凸包

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string.h>
    #include<iostream>
    #include<stdio.h>
    #include<cstdlib>
    using namespace std;
    int n,m;
    struct point{
        int x,y;
        point(){}
        point(int a,int b):
            x(a),y(b){}
        friend inline point operator -(const point &a,const point &b){
            return point(a.x-b.x,a.y-b.y);
        }
        friend inline int operator *(const point &a,const point &b){
            return a.x*b.y-a.y*b.x;
        }
        inline int calc()const{
            return x*x+y*y;
        }
    }p[10005],q[10005];
    inline bool comp(point a,point b){
        int res=(a-p[1])*(b-p[1]);
        if(res!=0) return res>0;//比较极角
        return (a-p[1]).calc()<(b-p[1]).calc();//极角相同比较长度(必须要短的在前,如果长的在前的话下面就必须把下面的弹出的条件改为>而不能有等于)
    }
    inline void graham(){
        int dat=1;
        for(int i=2;i<=n;i++){//找最左下角的点
            if(p[i].x<p[dat].x||(p[i].x==p[dat].x&&p[i].y<p[dat].y)){
                dat=i;
            }
        }
        if(dat!=1) swap(p[1],p[dat]);
        sort(p+2,p+1+n,comp);
        q[++m]=p[1];
        for(int i=2;i<=n;i++){
            while(m>=3&&(p[i]-q[m-1])*(q[m]-q[m-1])>=0)m--;//(这里>和>=没有区别,因为如果为0的话即共线,而现在是判断短的,加不加都不会对答案造成影响,如果短的在前的话就必须改为>)
            q[++m]=p[i];
        }
    }
    inline int  area(){
        int res=0;
        q[m+1]=q[1];
        for(int i=1;i<=m;i++){
            res+=q[i]*q[i+1];
        }
        return res/2;
    }
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y;
        graham();
        int ans=area()/50;
        cout<<ans<<'
    ';
    }
    
  • 相关阅读:
    1.MySql安装
    struts文件上传、文件下载
    Java内存模型
    虚拟机类加载机制
    JAVA内存管理
    算法
    POI
    SSH项目(1)
    classpath路径和properties
    AngularJS路由实现单页面跳转
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/10366473.html
Copyright © 2011-2022 走看看