UVA 10173 (几何凸包)
判断矩形能包围点集的最小面积:凸包
#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 (几何凸包)的更多相关文章
- 此坑待填 离散化思想和凸包 UVA - 10173 Smallest Bounding Rectangle
Smallest Bounding Rectangle Given the Cartesian coordinates of n(>0)2-dimensional points, write a ...
- uva 10065 (凸包+求面积)
链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&am ...
- HDU 4946 Area of Mushroom (几何凸包)
题目链接 题意:给定n个人,每个人有一个速度v方向任意.如果平面中存在一个点只有某个人到达的时间最短(即没有人比这个人到的时间更短或相同),那么我们定义这个店归这个人管辖,现在问这些人中哪些人的管辖范 ...
- 简单几何(凸包+多边形面积) POJ 3348 Cows
题目传送门 题意:求凸包 + (int)求面积 / 50 /************************************************ * Author :Running_Tim ...
- 简单几何(凸包+枚举) POJ 1873 The Fortified Forest
题目传送门 题意:砍掉一些树,用它们做成篱笆把剩余的树围起来,问最小价值 分析:数据量不大,考虑状态压缩暴力枚举,求凸包以及计算凸包长度.虽说是水题,毕竟是final,自己状压的最大情况写错了,而且忘 ...
- 简单几何(凸包) POJ 1696 Space Ant
题目传送门 题意:一个蚂蚁一直往左边走,问最多能走多少步,且输出路径 分析:就是凸包的变形题,凸包性质,所有点都能走.从左下角开始走,不停排序.有点纠结,自己的凸包不能AC.待理解透凸包再来写.. 好 ...
- 简单几何(凸包) POJ 1113 Wall
题目传送门 题意:求最短路线,使得线上任意一点离城堡至少L距离 分析:先求凸包,答案 = 凸包的长度 + 以L为半径的圆的周长 /*********************************** ...
- 简单几何(凸包) POJ 2187 Beauty Contest
题目传送门 题意:求两点的距离平方的最大值 分析:凸包模板题 /************************************************ * Author :Running_T ...
- UVa 10652 (简单凸包) Board Wrapping
题意: 有n块互不重叠的矩形木板,用尽量小的凸多边形将它们包起来,并输出并输出木板总面积占凸多边形面积的百分比. 分析: 几乎是凸包和多边形面积的裸题. 注意:最后输出的百分号前面有个空格,第一次交P ...
随机推荐
- Unity在编辑器状态下清空控制台信息
public static void ClearConsole() { var assembly = System.Reflection.Assembly.GetAssembly(typeof(Uni ...
- MySql_十六进制值
十六进制值 MySQL支持十六进制值.在数字上下文中,十六进制数如同整数(64位精度).在字符串上下文,如同二进制字符串,每对十六进制数字被转换为一个字符: mysql> SELECT x'4D ...
- Dialog , ProgressDialog , PopWindow 区别
本质区别: Dialog:非阻塞对话框,弹出对话框时时,后台还可以做事情,点击背景时,对话框消失 ProgressDialog:带有圆形进度或者条形进度的对话框,一般结合handler使用.任务完成后 ...
- http://stackoverflow.com/questions/6065169/requestanimationframe-with-this-keyword
Observe that you call obj.draw as : <button onclick="obj.draw() The first time obj.draw is c ...
- DELETE与TRUNCATE的区别
当执行 DELETE FROM TABLE后,会发现针对一个DELETE语句,该表中有多少行内容,数据库日志文件中,相对应的记录是就是多少条,每一条记录,对应的是行级别的删除.而且对应的LSN编号也是 ...
- jquery iframe自适应高度[转]
经典代码 iFrame 自适应高度,在IE6/IE7/IE8/Firefox/Opera/Chrome/Safari通过测试. 很古老的方法: <iframe src="../In ...
- (33)odoo中产品价格字段
打开product.template 和 product.product 模型发现有很多关于价格描述的字段 product.template: price list_pri ...
- 并发编程 05—— Callable和Future
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- Queue的push和front操作
#include <queue> #include <cstdlib> using namespace std; int main(){ queue<int> qu ...
- Teach Yourself Programming in Ten Years
Teach Yourself Programming in Ten Years——用十年教会自己编程 作者:Peter Norvig 译者:刘海粟 本文原文为:http://norvig.com/21 ...