UVA 10173 最小矩形覆盖(凸包+旋转卡壳)
来源:互联网 发布:背包问题 python 编辑:程序博客网 时间:2024/05/21 11:10
传送门
题意正如标题。
可为什么用旋转卡壳呢?
先把有的点用一个凸包维护,那么这个凸包一定覆盖了所有的点,如果要有一个矩形覆盖所有的点,
那么他一定有一条边和凸包的一条边重合。
#include<bits/stdc++.h>#define eps 1e-8using namespace std;const int _max = 1e3 + 10;const double PI = acos(-1);int n;int sgn(double x) //三态函数{if(fabs(x)<eps) return 0;else return x<0?-1:1;}struct point{double x,y;} p[_max],res[_max];bool mult(point sp,point ep,point op){return (sp.x - op.x) * (ep.y - op.y) >= (ep.x - op.x) * (sp.y - op.y);}bool operator < (const point &l, const point &r){return l.y < r.y ||(l.y == r.y && l.x < r.x);}int graham(point pnt[],int n, point res[]) //构造凸包{int i,len ,k = 0,top = 1;sort(pnt,pnt+n);if(n == 0)return 0;res[0] = pnt[0];if(n == 1)return 1;res[1] = pnt[1];if(n == 2)return 2;res[2] = pnt[2];for(int i =2; i < n; ++ i){while(top && mult(pnt[i],res[top],res[top-1]))top--;res[++top] = pnt[i];}len = top;res[++top] = pnt[n - 2];for(i = n - 3; i >= 0; -- i){while(top!=len && mult(pnt[i],res[top],res[top-1]))top--;res[++top] = pnt[i];}return top;//返回凸包中点的个数}double len(point A,point B) //返回向量AB的模平方{return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);}double dot(point A,point B,point C) //点乘{return (C.x-A.x)*(B.x-A.x)+(C.y-A.y)*(B.y-A.y);}double cross(point A,point B,point C) //叉乘{return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x);}double minRetangleCover() //最小矩形面积覆盖(旋转卡壳){if(n < 3) return 0.0;res[n] = res [0];double ans = -1;int r = 1, p = 1,q;for(int i = 0; i < n; ++ i){//卡出离边 res[i]-res[i+1]最远的点while(sgn(cross(res[i],res[i+1],res[r+1])-cross(res[i],res[i+1],res[r]))>=0)r = (r+1)% n;//卡出res[i]-res[i+1]方向上正向n最远的点while(sgn(dot(res[i],res[i+1],res[p+1])-dot(res[i],res[i+1],res[p]))>=0)p = (p+1)% n;if(i == 0) q = p;//卡出res[i]-res[i+1]方向上负向最远的点while(sgn(dot(res[i],res[i+1],res[q+1])-dot(res[i],res[i+1],res[q]))<=0)q = (q+1)% n;double d = len(res[i],res[i+1]);double temp = cross(res[i],res[i+1],res[r])*(dot(res[i],res[i+1],res[p])-dot(res[i],res[i+1],res[q]))/d;if(ans < 0 || ans > temp) ans = temp;}return ans;}int main(){#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endif // ONLINE_JUDGEwhile(scanf("%d",&n)==1 && n){for(int i = 0; i < n; ++ i){scanf("%lf%lf",&p[i].x,&p[i].y);}n = graham(p,n,res);//构造凸包printf("%.4f\n",minRetangleCover());}return 0;}
阅读全文
0 0
- UVA 10173 最小矩形覆盖(凸包+旋转卡壳)
- 【最小矩形面积覆盖:凸包+旋转卡壳】UVA 10173Smallest Bounding Rectangle
- 最小矩形覆盖(凸包旋转卡壳)
- [BZOJ1185][HNOI2007]最小矩形覆盖(凸包+旋转卡壳)
- 【BZOJ1185】最小矩形覆盖 计算几何 凸包 旋转卡壳
- HDU5251矩形面积(凸包+旋转卡壳求最小矩形覆盖)
- HDU 5251 矩形面积 (最小矩形覆盖 凸包+旋转卡壳 详解 推荐)
- HDU 5251 矩形面积 (计算几何+旋转卡壳求覆盖凸包的最小矩形面积)
- UVa 12307 Smallest Enclosing Rectangle(旋转卡壳+最小覆盖矩形)
- [BZOJ 1185][HNOI 2007]最小矩形覆盖(凸包+旋转卡壳)
- BZOJ1185 [HNOI2007]最小矩形覆盖(旋转卡壳)
- bzoj 1185: [HNOI2007]最小矩形覆盖 (旋转卡壳)
- [BZOJ1185][HNOI2007]最小矩形覆盖(旋转卡壳)
- HDU 5251 矩形面积(二维凸包旋转卡壳最小矩形覆盖问题) --2015百度之星题目
- poj 5251(凸包 旋转卡壳)最小矩形面积
- uva 10173 凸包最小覆盖矩形面积
- 旋转卡壳法求点集的最小覆盖矩形面积以及周长
- BZOJ 1185 HNOI2007 最小矩形覆盖 旋转卡壳
- 多种方式进行访问http接口,需注意:
- 国庆技术博客之XListView的上拉刷新和下拉加载
- D
- Factorization Machine算法
- 关于期望线性性的探讨
- UVA 10173 最小矩形覆盖(凸包+旋转卡壳)
- 基于OpenCV的视频图像组态 (2) :动画总体
- Myeclipse怎么修改项目名称
- Leetcode204. 埃拉托色尼法计算质数个数
- 机器学习 第三周 总结 知识点
- js表达式中的类型转换
- 嵌入式中使用设计模式(1)--工厂模式
- 英语六级之完形填空
- Spring框架-第四弹