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

 #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. php中的匿名函数和闭包(closure)

    一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...

  2. Linux sticky bit 目录权限 rwt权限

    [linux权限分为 user group others三组] 今天看到有个目录的权限是rwxrwxrwt 很惊讶这个t是什么,怎么不是x或者-呢?搜了下发现: 这个t代表是所谓的sticky bit ...

  3. [Python爬虫]cnblogs博客备份工具(可扩展成并行)

    并发爬虫小练习. 直接粘贴到本地,命名为.py文件即可运行,运行时的参数为你想要爬取的用户.默认是本博客. 输出是以用户名命名的目录,目录内便是博客内容. 仅供学习python的多线程编程方法,后续会 ...

  4. (转)内联(inline)函数与虚函数(virtual)的讨论

    本文转自: http://topic.csdn.net/t/20051220/09/4469273.html 函数的inline属性是在编译时确定的, 然而,virtual的性质是在运行时确定的,这两 ...

  5. iOS - Xcode 常用快捷键

    Xcode 常用快捷键 1)文件: command + shift + n 新建项目 command + n 新建文件 command + control + n 新建空文件 command + o ...

  6. 转 一个典型的 C++ 程序员成长经历:

    1.  完整的学一遍 C++ 所有语言特性,典型书籍 "The C++ Programming Language" Part1, Part2, "C++ Primer&q ...

  7. 安装numpy+mkl

    引子: 运行from sklearn.dataset import load_iris 时提示: Traceback (most recent call last): File "F:/gi ...

  8. Python之路 day1 用户登录多次被锁定

    编写登陆接口: 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 #Author:ersa import getpass,os,sys #读取账户信息到内存中 try: accounts_fil ...

  9. Yii 提示Invalid argument supplied for foreach() 等错误

    Yii 提示Invalid argument supplied for foreach() 或者 undefined variable: val等错误 只需要在对应的文件中加入error_report ...

  10. 如何有效使用Project(1)——编制进度计划、保存基准

    1.前言: 软件产品的研发.升级.定制等,一般都是以项目的形式进行,此时项目进度计划以及资源使用情况就变成了项目经理关注的重点.如何让项目计划有效可控,及时暴露问题?如何查看资源的负荷情况,看资源分配 ...