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的更多相关文章

  1. UVA 12307 Smallest Enclosing Rectangle(旋转卡壳)

    题意:给你一些点,找出两个可以包含所有点的矩形,一个保证矩形面积最小,一个保证矩形周长最小,输出两个最小值 题解:首先根据所有点求一个凸包,再在这个凸包上枚举每条边,作为矩形的一条边(这样可以保证最小 ...

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

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

  3. Smallest Bounding Rectangle - uva10173

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

  4. UVA 12300 Smallest Regular Polygon(正多边形)

    题意:给出两点,求经过这两点的正n边形的最小面积 题解:这两点一定是最长的弦,我们设正多边形中点c,找到c到每个点的距离(都相同) 我们知道那个等腰三角形的底与每个角度就使用余弦定理 #include ...

  5. 最小圆覆盖(Smallest Enclosing Discs)

    随机增量算法(a randomized incremental algorithm) #define sqr(x) ((x)*(x)) #define EPS 1e-4 struct P{ doubl ...

  6. UVa 11536 Smallest Sub-Array (水题, 滑动窗口)

    题意:给定 n 个由0~m-1的整数组成的序列,输入 k ,问你找出连续的最短序列,使得这个序列含有1-k的所有整数. 析:这个题,很简单么,只要从头开始扫一遍就OK,时间复杂度为O(n). 代码如下 ...

  7. uva 11536 - Smallest Sub-Array

    题目大意:按照题目中的要求构造出一个序列,找出最短的子序列,包含1~k. 解题思路:先根据题目的方法构造出序列,然后用Towpointer的方法,用v[i]来记录当前[l, r]中有几个i:当r移动时 ...

  8. uva 12300 - Smallest Regular Polygon

    题意:给定两个点A和B,求包含这两个点的面积最小的正 n(已知)边形. #include<iostream> #include<iomanip> #include<cma ...

  9. UVA10173 Smallest Bounding Rectangle 最小面积矩形覆盖

    \(\color{#0066ff}{题目描述}\) 给定n(>0)二维点的笛卡尔坐标,编写一个程序,计算其最小边界矩形的面积(包含所有给定点的最小矩形). 输入文件可以包含多个测试样例.每个测试 ...

随机推荐

  1. 接口自动化测试框架-AIM

    最近在做公司项目的自动化接口测试,在现有几个小框架的基础上,反复研究和实践,搭建了新的测试框架.利用业余时间,把框架总结了下来. AIM框架介绍 AIM,是Automatic Interface Mo ...

  2. 分分钟让你理解HTTPS

    一.HTTP存在的问题 1.1 可能被窃听 HTTP 本身不具备加密的功能,HTTP 报文使用明文方式发送 由于互联网是由联通世界各个地方的网络设施组成,所有发送和接收经过某些设备的数据都可能被截获或 ...

  3. Fibbing以让虚结点的设置更简单为目的优化网络需求

  4. 四种losses

    1. Classification losses 每次输入一个样本,对样本进行类别预测,根据预测类别和真实标签得到对应的分类损失. 2. Pairwise losses 每次输入两个样本,数据集包含了 ...

  5. NetFPGA Demo ——reference_nic_nf1_cml

    NetFPGA Demo --reference_nic_nf1_cml 实验平台 OS:deepin 15.4 开发板:NetFPGA_1G_CML 实验过程 从NetFPGA-1G-CML从零开始 ...

  6. 团队作业4——WBS练习

    一.作业要求 对团队项目进行任务分解 —要求所有人共同参与 队长列出需求 成员进行估计 队长领导大家达成共识 形成团队报告,发至团队博客 注意:分解的粒度最小不应超过6小时(即一个人在6小时以内能够完 ...

  7. servlet编码乱码问题

    继承HttpServlet 重写doGet(HttpServletRequest req,HttpServletResponse resp),doPost()方法 post提交时: protected ...

  8. Prometheus 和 Grafana的简单学习

    1. 下载 暂时不采用 docker化部署 prometheus下载地址 https://github.com/prometheus/prometheus/releases/ prometheus的e ...

  9. a标签属性 rel=noopener noreferrer

    当你浏览一个页面点击一个a标签链接跳转到另一个页面时, <a href="http://www.baidu.com" target="_blank"> ...

  10. SparkException: Master removed our application

    come from https://stackoverflow.com/questions/32245498/sparkexception-master-removed-our-application ...