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<<'\n';
}

猜你喜欢

转载自blog.csdn.net/qq_42555009/article/details/83058865