zoukankan      html  css  js  c++  java
  • Cows POJ

    Andrew似乎是Graham的上位替代?

    反正15行的代码长度还是很有保存价值的

    //#include<bits/stdc++.h>  
    //#pragma comment(linker, "/STACK:1024000000,1024000000")   
    #include<stdio.h>  
    #include<algorithm>  
    #include<queue>  
    #include<string.h>  
    #include<iostream>  
    #include<math.h>  
    #include<set>  
    #include<map>  
    #include<vector>  
    #include<iomanip>  
    using namespace std;  
      
    const double pi=acos(-1.0);  
    #define ll long long  
    #define pb push_back
    
    #define sqr(a) ((a)*(a))
    #define dis(a,b) sqrt(sqr(a.x-b.x)+sqr(a.y-b.y))
    
    const int maxn=1e3+56;
    const int inf=0x3f3f3f3f;
    
    int n;
    
    struct Point{
    	double x,y;
    	Point(){}
    	Point(double x,double y):x(x),y(y){}
    	Point operator+(const Point& rhs)const{return Point(x+rhs.x,y+rhs.y);}
    	Point operator-(const Point& rhs)const{return Point(x-rhs.x,y-rhs.y);}
    	Point operator*(const double d)const{return Point(d*x,d*y);}
    	double cross(const Point &rhs)const{
    		return (x*rhs.y-y*rhs.x);
    	}
    }point[maxn],vertex[maxn];
    
    bool cmp_x(const Point a,const Point b){
    	if(a.x==b.x)return a.y<b.y;
    	else return a.x<b.x;
    }
    
    int Andrew(){		//返回凸包顶点数
    	sort(point,point+n,cmp_x);
    	int k=0;
    	for(int i=0;i<n;i++){
    		while(k>1 && (vertex[k-1]-vertex[k-2]).cross(point[i]-vertex[k-1])<=0)k--;
    		vertex[k++]=point[i];
    	}
    	int m=k;
    	for(int i=n-2;i>=0;i--){
    		while(k>m && (vertex[k-1]-vertex[k-2]).cross(point[i]-vertex[k-1])<=0)k--;
    		vertex[k++]=point[i];
    	}
    	if(k>1)k--;	//k=1凸包退化
    	return k;
    }
    
    void solve(){		//求凸包面积,计算方式是凸包底边三角形的面积并
    	int tot=Andrew();
    	if(tot<=2){printf("0
    ");return;}
    	double area=0;
    	for(int i=2;i<tot;i++){
    		double a=dis(vertex[i-1],vertex[0]);
    		double b=dis(vertex[i],vertex[0]);
    		double c=dis(vertex[i],vertex[i-1]);
    		double p=(a+b+c)/2;
    		area+=sqrt(p*(p-a)*(p-b)*(p-c));
    	}
    	printf("%d
    ",(int)(area/50.0));	//每头牛50平米面积
    }
    
    int main(){
    	while(~scanf("%d",&n)){
    		for(int i=0;i<n;i++){
    			scanf("%lf%lf",&point[i].x,&point[i].y);
    		}
    		solve();
    	}
    }


  • 相关阅读:
    ThinkInJava4读书笔记之第二章一切都是对象
    工具类Excel相关处理
    工具类ID生成器工具类
    工具类获取地址
    工具类反射工具类
    工具类Md5加密方法
    工具类通用http工具封装
    工具类Base64工具类
    工具类通用http发送方法
    工具类spring工具类 方便在非spring管理环境中获取bean
  • 原文地址:https://www.cnblogs.com/Drenight/p/8611244.html
Copyright © 2011-2022 走看看