判断矩形能包围点集的最小面积:凸包

 #include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <sstream>
#include <algorithm>
#define Max 2147483647
#define INF 0x7fffffff
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define repu(i, a, b) for(int i = (a); i < (b); i++)
const double PI=-acos(-1.0);
#define eps 1e-8
#define N 50010
using namespace std;
struct Point
{
double x,y;
Point() {}
Point(double x0,double y0):x(x0),y(y0) {}
};
Point p[N];
int con[N];
int cn;
int n;
struct Line
{
Point a,b;
Line() {}
Line(Point a0,Point b0):a(a0),b(b0) {}
};
double Xmult(Point o,Point a,Point b)
{
return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);
}
double Dmult(Point o,Point a,Point b)
{
return (a.x-o.x)*(b.x-o.x)+(a.y-o.y)*(b.y-o.y);
}
int Sig(double a)
{
return a<-eps?-:a>eps;
}
double Dis(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int cmp(Point a,Point b)
{
double d=Xmult(p[],a,b);
if(d>)
return ;
if(d== && Dis(p[],a)<Dis(p[],b))
return ;
return ;
}
double min(double a,double b)
{
return a<b?a:b;
}
void Graham()
{
int i,ind=;
for(i=; i<n; i++)
if(p[ind].y>p[i].y || (p[ind].y==p[i].y) && p[ind].x>p[i].x)
ind=i;
swap(p[ind],p[]);
sort(p+,p+n,cmp);
con[]=;
con[]=;
cn=;
for(i=; i<n; i++)
{
while(cn> && Sig(Xmult(p[con[cn-]],p[con[cn]],p[i]))<=)
cn--;
con[++cn]=i;
}
int tmp=cn;
for(i=n-; i>=; i--)
{
while(cn>tmp && Sig(Xmult(p[con[cn-]],p[con[cn]],p[i]))<=)
cn--;
con[++cn]=i;
}
}
double Solve()
{
int t,r,l;
double ans=;
t=r=;
if(cn<)
return ;
for(int i=; i<cn; i++)
{
while(Sig( Xmult(p[con[i]],p[con[i+]],p[con[t+]])-
Xmult(p[con[i]],p[con[i+]],p[con[t]]) )>)
t=(t+)%cn;
while(Sig( Dmult(p[con[i]],p[con[i+]],p[con[r+]])-
Dmult(p[con[i]],p[con[i+]],p[con[r]]) )>)
r=(r+)%cn;
if(!i) l=r;
while(Sig( Dmult(p[con[i]],p[con[i+]],p[con[l+]])-
Dmult(p[con[i]],p[con[i+]],p[con[l]]) )<=)
l=(l+)%cn;
double d=Dis(p[con[i]],p[con[i+]]);
double tmp=Xmult(p[con[i]],p[con[i+]],p[con[t]])*
( Dmult(p[con[i]],p[con[i+]],p[con[r]])-
Dmult(p[con[i]],p[con[i+]],p[con[l]]) )/d/d;
ans=min(ans,tmp);
}
return ans;
}
int main()
{
int i,T;
scanf("%d",&T);
repu(kase,,T+)
{
scanf("%d",&n);
n *= ;
for(i=; i<n; i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
Graham();
printf("Case #%d:\n%.0lf\n",kase,Solve());
}
return ;
}

UVA 10173 (几何凸包)的更多相关文章

  1. 此坑待填 离散化思想和凸包 UVA - 10173 Smallest Bounding Rectangle

    Smallest Bounding Rectangle Given the Cartesian coordinates of n(>0)2-dimensional points, write a ...

  2. uva 10065 (凸包+求面积)

    链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&am ...

  3. HDU 4946 Area of Mushroom (几何凸包)

    题目链接 题意:给定n个人,每个人有一个速度v方向任意.如果平面中存在一个点只有某个人到达的时间最短(即没有人比这个人到的时间更短或相同),那么我们定义这个店归这个人管辖,现在问这些人中哪些人的管辖范 ...

  4. 简单几何(凸包+多边形面积) POJ 3348 Cows

    题目传送门 题意:求凸包 + (int)求面积 / 50 /************************************************ * Author :Running_Tim ...

  5. 简单几何(凸包+枚举) POJ 1873 The Fortified Forest

    题目传送门 题意:砍掉一些树,用它们做成篱笆把剩余的树围起来,问最小价值 分析:数据量不大,考虑状态压缩暴力枚举,求凸包以及计算凸包长度.虽说是水题,毕竟是final,自己状压的最大情况写错了,而且忘 ...

  6. 简单几何(凸包) POJ 1696 Space Ant

    题目传送门 题意:一个蚂蚁一直往左边走,问最多能走多少步,且输出路径 分析:就是凸包的变形题,凸包性质,所有点都能走.从左下角开始走,不停排序.有点纠结,自己的凸包不能AC.待理解透凸包再来写.. 好 ...

  7. 简单几何(凸包) POJ 1113 Wall

    题目传送门 题意:求最短路线,使得线上任意一点离城堡至少L距离 分析:先求凸包,答案 = 凸包的长度 + 以L为半径的圆的周长 /*********************************** ...

  8. 简单几何(凸包) POJ 2187 Beauty Contest

    题目传送门 题意:求两点的距离平方的最大值 分析:凸包模板题 /************************************************ * Author :Running_T ...

  9. UVa 10652 (简单凸包) Board Wrapping

    题意: 有n块互不重叠的矩形木板,用尽量小的凸多边形将它们包起来,并输出并输出木板总面积占凸多边形面积的百分比. 分析: 几乎是凸包和多边形面积的裸题. 注意:最后输出的百分号前面有个空格,第一次交P ...

随机推荐

  1. Asp.net 头像的简单实现

    1:创建数据库 Create Table ImageSave ( ID ,), Name ), img image ) 2:上传照片页关键代码 前台: <div> <asp:File ...

  2. TCP状态转移图学习总结

    http://blog.csdn.net/hairetz/article/details/6221620 这是网络编程的基础,tcp的状态转移图说到底就是一个状态机的不同状态之间的转换关系以及触发这些 ...

  3. JS设置cookie

    cookie 与 session 是网页开发中常用的信息存储方式.Cookie是在客户端开辟的一块可存储用户信息的地方:Session是在服务器内存中开辟的一块存储用户信息的地方. JavaScrip ...

  4. word2013 blog test

    测试一:style里的内容能保存吗?: int        read; byte *    buf; int        tries; int        read; byte *    buf ...

  5. 内核编译选配(VMware篇)

    出现这个错误的原因是相应的驱动程序没有编译进内核,所以在内核启动时,不认识分区. 一.磁盘驱动没编译进内核 VMware5.5.3 的磁盘有两种,一种是IDE的,一种是SCSI的:VMware 你在新 ...

  6. Fiddler—PC上实现手机的抓包

    PC上安装Fiddler之后,可以抓取各种浏览器的请求,通过一些设置可以获取iPhone.安卓手机.windows phone的请求.具体的工作原理我也不多说(哼,绝对不是因为我不懂XD),主要说下如 ...

  7. mac 启动apache + php

    一.启动Apache 在终端里输入命令,启动 Apache: sudo apachectl start 关闭 Apache: sudo apachectl stop 重启 Apache:sudo ap ...

  8. 程序设计入门——C语言 第3周编程练习 2 数字特征值(5分)

    2 数字特征值(5分) 题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作 ...

  9. caffe中python接口的使用

    下面是基于我自己的接口,我是用来分类一维数据的,可能不具通用性: (前提,你已经编译了caffe的python的接口) 添加 caffe塻块的搜索路径,当我们import caffe时,可以找到. 对 ...

  10. Redis设计思路学习与总结

    版权声明:本文由宋增宽原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/222 来源:腾云阁 https://www.qclo ...