POJ 3348 /// 凸包+多边形面积

题目大意:

给定的n个点 能圈出的最大范围中

若每50平方米放一头牛 一共能放多少头

求凸包 答案就是 凸包的面积/50 向下取整

/// 求多边形面积
// 凹多边形同样适用 因为点积求出的是有向面积
double areaPg()
{
double res=;
for(int i=;i<k-;i++) // 以t[0]为划分顶点
res+=(t[i]-t[]).det(t[i+]-t[]);
return res/2.0;
}
#include <cstdio>
#include <algorithm>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std; const double eps=1e-;
double add(double a,double b) {
if(abs(a+b)<eps*(abs(a)+abs(b))) return ;
return a+b;
}
struct P {
double x,y;
P(){};
P(double _x,double _y):x(_x),y(_y){};
P operator - (P p) {
return P(add(x,-p.x),add(y,-p.y)); }
P operator + (P p) {
return P(add(x,p.x),add(y,p.y)); }
P operator * (double d) {
return P(x*d,y*d); }
double dot(P p) {
return add(x*p.x,y*p.y); }
double det(P p) {
return add(x*p.y,-y*p.x); }
}p[], t[];
int n, k;
bool cmp(P a,P b) {
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
void andrew()
{
sort(p,p+n,cmp);
k=;
for(int i=;i<n;i++) {
while(k> && (t[k-]-t[k-]).det(p[i]-t[k-])<)
k--;
t[k++]=p[i];
}
for(int i=n-,j=k;i>=;i--) {
while(k>j && (t[k-]-t[k-]).det(p[i]-t[k-])<)
k--;
t[k++]=p[i];
}
if(n>) k--;
}
double areaPg()
{
double res=;
for(int i=;i<k-;i++)
res+=(t[i]-t[]).det(t[i+]-t[]);
return res/2.0;
}
void solve()
{
andrew();
int ans=areaPg()/;
printf("%d\n",ans);
} int main()
{
while(~scanf("%d",&n)) {
for(int i=;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
solve();
} return ;
}
上一篇:[python2] python 打印表格 prettytable


下一篇:poj 1654 Area(计算几何--叉积求多边形面积)