UVA 12307 Smallest Enclosing Rectangle
https://vjudge.net/problem/UVA-12307
求覆盖所有点的最小矩形面积、周长
相当于求凸包的最小面积外接矩形、最小周长外接矩形
结论:
这个矩形一定有一条边和凸包上一条边重合
证明去看https://wenku.baidu.com/view/f11d0836ee06eff9aef807d9.html

枚举一条边,用旋转卡壳求其他三边
假设现在正枚举到A点,对应紫色边,
显然,紫色边的对边一定 过A点的对踵点且与紫色边平行
那么矩形的高|BH|=AE、AB的叉积/ | AB |
现在只剩下|GD|
把向量CD平移至向量AF
|GD|=cos(∠CDG)*|CD|=cos(∠CDG)*|AF|
AF*AD=|AF|*|AD|*cos(∠DAF)
∵∠CDG=∠DAF
∴AF*AD=|GD|*|AD|
所以|GD|=AF*AD/|AD|
点A是枚举的,如何求点B C K?
上面说了,点B是点A的对踵点,
那么利用叉积,同底三角形面积越大,高越大 即可求出B点
直观上看,K点是距点A最靠右的点
即沿向量AD向右扩展
向右就可以想到两个向量点积>0
即下一个点与这个点组成的向量,如果AD与它的点积>0,K取下一个点更优
C点同理,点积<0
注意C是从点B开始逆时针寻找的最靠左的点
#include<cmath>
#include<cstdio>
#include<algorithm> #define N 100001 using namespace std; const double eps=1e-; int dcmp(double x)
{
if(fabs(x)<eps) return ;
return x< ? - : ;
} struct Point
{
double x,y; Point(double x=,double y=) : x(x),y(y) { } bool operator < (Point p) const
{
if(!dcmp(x-p.x)) return y<p.y;
return x<p.x;
} bool operator == (Point p) const
{
return !dcmp(x-p.x) && !dcmp(y-p.y);
}
}; typedef Point Vector; Point P[N],C[N]; Vector operator - (Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); } double Cross(Vector A,Vector B)
{
return A.x*B.y-A.y*B.x;
} double Area2(Point A,Point B,Point D)
{
return Cross(B-A,D-A);
} double Dot(Vector A,Vector B)
{
return A.x*B.x+A.y*B.y;
} double Length(Vector A)
{
return sqrt(Dot(A,A));
} int ConvexHull(Point *p,int n,Point *c)
{
sort(p,p+n);
n=unique(p,p+n)-p;
int m=;
for(int i=;i<n;++i)
{
while(m> && Cross(c[m-]-c[m-],p[i]-c[m-])<=)
m--;
c[m++]=p[i];
}
int k=m;
for(int i=n-;i>=;--i)
{
while(m>k && Cross(c[m-]-c[m-],p[i]-c[m-])<=)
m--;
c[m++]=p[i];
}
m--;
return m;
} void RotatingCaliper(Point *c,int m)
{
double AnsArea=1e20,AnsPeri=1e20;
int q=,l=,r=;
double d,h,w;
for(int p=;p<m;++p)
{
while(fabs(Cross(c[p]-c[p+],c[q+]-c[p+]))>fabs(Cross(c[p]-c[p+],c[q]-c[p+]))) q=(q+)%m;
while(dcmp(Dot(c[p+]-c[p],c[r+]-c[r]))>) r=(r+)%m;
if(!l) l=q;
while(dcmp(Dot(c[p+]-c[p],c[l+]-c[l]))<) l=(l+)%m;
d=Length(c[p+]-c[p]);
h=fabs(Area2(c[p],c[p+],c[q]))/d;
w=Dot(c[p+]-c[p],c[r]-c[l])/d;
AnsArea=min(AnsArea,w*h);
AnsPeri=min(AnsPeri,(w+h)*);
}
printf("%.2lf %.2lf\n",AnsArea,AnsPeri);
} int main()
{
int n,m;
while()
{
scanf("%d",&n);
if(!n) return ;
for(int i=;i<n;++i) scanf("%lf%lf",&P[i].x,&P[i].y);
m=ConvexHull(P,n,C);
RotatingCaliper(C,m);
}
}
UVA 12307 Smallest Enclosing Rectangle的更多相关文章
- UVA 12307 Smallest Enclosing Rectangle(旋转卡壳)
题意:给你一些点,找出两个可以包含所有点的矩形,一个保证矩形面积最小,一个保证矩形周长最小,输出两个最小值 题解:首先根据所有点求一个凸包,再在这个凸包上枚举每条边,作为矩形的一条边(这样可以保证最小 ...
- 此坑待填 离散化思想和凸包 UVA - 10173 Smallest Bounding Rectangle
Smallest Bounding Rectangle Given the Cartesian coordinates of n(>0)2-dimensional points, write a ...
- Smallest Bounding Rectangle - uva10173
Smallest Bounding Rectangle Given the Cartesian coordinates of n(>0)2-dimensional points, write a ...
- UVA 12300 Smallest Regular Polygon(正多边形)
题意:给出两点,求经过这两点的正n边形的最小面积 题解:这两点一定是最长的弦,我们设正多边形中点c,找到c到每个点的距离(都相同) 我们知道那个等腰三角形的底与每个角度就使用余弦定理 #include ...
- 最小圆覆盖(Smallest Enclosing Discs)
随机增量算法(a randomized incremental algorithm) #define sqr(x) ((x)*(x)) #define EPS 1e-4 struct P{ doubl ...
- UVa 11536 Smallest Sub-Array (水题, 滑动窗口)
题意:给定 n 个由0~m-1的整数组成的序列,输入 k ,问你找出连续的最短序列,使得这个序列含有1-k的所有整数. 析:这个题,很简单么,只要从头开始扫一遍就OK,时间复杂度为O(n). 代码如下 ...
- uva 11536 - Smallest Sub-Array
题目大意:按照题目中的要求构造出一个序列,找出最短的子序列,包含1~k. 解题思路:先根据题目的方法构造出序列,然后用Towpointer的方法,用v[i]来记录当前[l, r]中有几个i:当r移动时 ...
- uva 12300 - Smallest Regular Polygon
题意:给定两个点A和B,求包含这两个点的面积最小的正 n(已知)边形. #include<iostream> #include<iomanip> #include<cma ...
- UVA10173 Smallest Bounding Rectangle 最小面积矩形覆盖
\(\color{#0066ff}{题目描述}\) 给定n(>0)二维点的笛卡尔坐标,编写一个程序,计算其最小边界矩形的面积(包含所有给定点的最小矩形). 输入文件可以包含多个测试样例.每个测试 ...
随机推荐
- stl源码剖析 详细学习笔记 空间配置器
//---------------------------15/04/05---------------------------- /* 空间配置器概述: 1:new操作包含两个阶段操作 1>调 ...
- 使用Memcached提高.NET应用程序的性能(转)
标签:分布式缓存 .NET Memcached Performance 性能 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zh ...
- Mistakes I Made(as a developer)...大龄程序员的忠告...(部分转...)
在2006年,我开始了编程工作.当意识到来到了十年这个重要的时间关口时,我觉得有必要回顾一下这十年间所犯下的错误,做一做经验总结,并且给正在这个职业上奋斗的人们提出我的一些忠告.开发行业变化得很快,我 ...
- .net转PHP从零开始-配置visual studio 2013 PHP开发环境php for visual studio
作为一个.net开发者,一直在visual studio这款强大的编辑器宠爱下,其他编辑器都不会用,也用着不熟练.最近这不是转php吗,使用php编辑器很不爽,觉得还是用visual studio舒服 ...
- BlogPublishTool - 博客发布工具
BlogPublishTool - 博客发布工具 这是一个发布博客的工具.本博客使用本工具发布. 本工具源码已上传至github:https://github.com/ChildishChange/B ...
- LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下)
LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...
- oracle union
union 取并集,去重不仅去掉两个集合之间的重复,也会去掉集合的自重复
- UIO,大页内存,CPU亲和性,NUMA机制等
Linux环境下的UIO(Userspace I/O) UIO 用户空间下驱动程序的支持机制.DPDK使用UIO机制使网卡驱动程序运行在用户态,并采用轮询和零拷贝方式从网卡收取报文,提高收发报文的性能 ...
- List元素删除不会导致越界但有问题的写法
今天在论坛里看到一段请教list删除的问题,下面先看代码: public static void main(String[] args) { List<Integer> list = ne ...
- BZOJ2738 矩阵乘法 【整体二分 + BIT】
题目链接 BZOJ2738 题解 将矩阵中的位置取出来按权值排序 直接整体二分 + 二维BIT即可 #include<algorithm> #include<iostream> ...