http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24011

给定n个点3~1e5,求出包含所有点的面积最小的矩形,周长最小矩形,输出最小面积和最小周长

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#include <stack>
#include <set>
#include <algorithm>
using namespace std;#define For(i,a,b) for(int (i)=(a);(i) < (b);(i)++)
#define rof(i,a,b) for(int (i)=(a);(i) > (b);(i)--)
#define IOS ios::sync_with_stdio(false)
#define lson l,m,rt <<1
#define rson m+1,r,rt<<1|1
#define mem(a,b) memset(a,b,sizeof(a))typedef long long ll;
typedef unsigned long long ull;
const double eps = 1e-11;
const double INF = 1e8;
const double PI = acos(-1.0);
const double TWO_PI = PI * 2;
template <class T> T sqr(T x) { return x * x;}struct Point
{double x,y;Point(double x=0,double y=0):x(x),y(y){}
};
typedef Point Vector;//点-点=向量
Vector operator - (Point A, Point B) { return Vector(A.x-B.x,A.y-B.y);}
Vector operator *(Vector A, double p){return Vector(A.x*p,A.y*p); }
Vector operator /(Vector A, double p){return Vector(A.x/p,A.y/p); }
Vector operator +(Vector A, Vector B){ return Vector(A.x+B.x,A.y+B.y);}//三态比较函数
int dcmp(double x){if(fabs(x)<eps) return 0;else return x<0?-1:1;
}
double Dot(Vector A, Vector B) { return A.x*B.x+A.y*B.y; }
double Cross (Vector A,Vector B){ return A.x*B.y-A.y*B.x; }
double Length(Vector A) {return sqrt(Dot(A,A)); }
double Dist(Point a,Point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
double Dist2(Point A, Point B){ return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y); }
double Angle(Vector A, Vector B){ return acos(Dot(A,B)/Length(A)/Length(B));}//返回A,B夹角[0,PI]
bool operator < (const Point &a,const Point &b) {return a.x<b.x||(a.x==b.x&&a.y<b.y); }
bool operator ==  (const Point &a,const Point &b){return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0; }
Vector Normal(const Vector& A) { double L = Length(A); return Vector(-A.y/L, A.x/L); }//左转90°// 点集凸包
// 如果不希望在凸包的边上有输入点,把两个 <= 改成 <
// 如果不介意点集被修改,可以改成传递引用
vector<Point> ConvexHull(vector<Point> p)
{sort(p.begin(), p.end());p.erase(unique(p.begin(), p.end()), p.end());int n=p.size();int m=0;vector<Point> ch(n+1);for(int i=0;i<n;i++){while(m>1&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;ch[m++]=p[i];}int k=m;for(int i=n-2;i>=0;i--){while(m>k&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)m--;ch[m++]=p[i];}if(n>1) m--;ch.resize(m);return ch;
}
//
void Qiake(vector<Point> & p,double & area,double & len){vector<Point> ch=ConvexHull(p);int n=ch.size();ch.push_back(ch[0]);int v=1,l=1,r=1;area=1e15,len=1e15;for(int u=0;u<n;u++){while(Cross(ch[u+1]-ch[u],ch[v+1]-ch[v])>eps) v=(v+1)%n;while(Dot(ch[u+1]-ch[u],ch[r+1]-ch[r])>eps) r=(r+1)%n;if(u==0) l=(r+1)%n;while(Dot(ch[u+1]-ch[u],ch[l+1]-ch[l])<-eps) l=(l+1)%n;//u,v相对,l,r相对  u,r,v,ldouble d=Dist(ch[u+1],ch[u]);double h=Cross(ch[u+1]-ch[u],ch[v]-ch[u])/d;//u到当前边的距离double w=(Dot(ch[r]-ch[u],ch[u+1]-ch[u])-Dot(ch[l]-ch[u],ch[u+1]-ch[u]))/d;area=min(area,h*w);len=min(len,2*(h+w));}
}int n;
vector<Point> p;
int main()
{while(scanf("%d",&n)){if(n==0) break;p.clear();for(int i=0;i<n;i++){double x,y;scanf("%lf%lf",&x,&y);p.push_back(Point(x,y));}double ans1,ans2;Qiake(p,ans1,ans2);printf("%.2f %.2f\n",ans1,ans2 );}return 0;
}

UVA 12307 旋转卡壳相关推荐

  1. UVA 10173 旋转卡壳

    题意: 给出一些点,求最小的覆盖这些点的矩形的面积. 题解: 枚举下边界(是一条边),然后暴力卡壳左右边界(点),再暴力上边界(点),更新答案. View Code 1 #include <io ...

  2. 算法复习——凸包加旋转卡壳(poj2187)

    题目: Description Bessie, Farmer John's prize cow, has just won first place in a bovine beauty contest ...

  3. Bridge Across Islands POJ - 3608 旋转卡壳求凸包最近距离

    \(\color{#0066ff}{题目描述}\) 几千年前,有一个小王国位于太平洋的中部.王国的领土由两个分离的岛屿组成.由于洋流的冲击,两个岛屿的形状都变成了凸多边形.王国的国王想建立一座桥来连接 ...

  4. BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 1435  Solv ...

  5. 算法学习:计算几何旋转卡壳

    [定义] [对踵点]多边形上存在平行切线的两点 [多边形半径]多边形上任意两点的最大长度 [旋转卡壳] 选取y轴上,最高和最低的两个点,令两条平行于x轴的线切过这两点 然后我们开始让这两条线旋转 当一 ...

  6. bzoj 1069 [SCOI2007]最大土地面积——旋转卡壳

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1069 发现 n 可以 n^2 .所以枚举对角线,分开的两部分三角形就可以旋转卡壳了. 注意坐 ...

  7. 【BZOJ1185】【HNOI2007】最小矩形覆盖(凸包+旋转卡壳)

    传送门 题意:求最小矩阵覆盖 有这样一个结论:矩阵一定有一条边在凸包上(不会证) 那可以枚举每条边 同时旋转卡壳 只是这时不只维护一个对踵点对,同时在左右侧再维护一个最远点 可以发现左右最远点一定是和 ...

  8. poj 2079(旋转卡壳)

    题意:求出平面内的点集所组成的面积最大的三角形. 解题思路:考虑凸包+旋转卡壳.面积最大的三角形的三点必定在凸包的顶点上,只不过这里要注意,三角形的边不一定就是凸包的边,有可能三角形相邻两点是横跨凸包 ...

  9. poj 2187 Beauty Contest (凸包: 最远点对,最长直径 , 旋转卡壳法)

    http://poj.org/problem?id=2187 题意: 最长的点对近距离的平方: 题解: 旋转卡壳法, 要注意的地方是,有 所有点共线的情况,所以,(求凸包时)要将,共线点去出 :    ...

  10. POJ 2187 凸包+旋转卡壳

    思路: 求个凸包 旋转卡壳一下 就求出来最远点对了 注意共线情况 也就是说   凸包如果有一堆点共线保留端点即可 //By SiriusRen #include <cmath> #incl ...

最新文章

  1. 用动图讲解分布式 Raft
  2. 通过实验取证:TCP三次握手的过程
  3. sharepoint配置问题解决方案
  4. php l方法,ThinkPHP的L方法使用简介
  5. encrypt函数c语言,Crypt加密函数简介(C语言)
  6. Flutter 底部向上动画弹出的菜单选项
  7. Delphi 的绘图功能[9] - TextRect
  8. Tensorflow:模型调参
  9. python之路--动态传参,作用域,函数嵌套
  10. Python系列之Python-docx生成运行日报Word模板
  11. 分析一款帮你戒烟的App戒烟行动(kick it)
  12. 标签制作软件如何制作圆形标签中的弧形文字
  13. 不撞南墙不回头——树形动态规划(树规)
  14. whatamitoyou-小白详解
  15. python机器学习(一)
  16. JavaConfig+springboot入门
  17. 【Joshua B. Tenenbaum】非线性降维的全局几何框架
  18. Citrix Receiver Desktop Lock 4.x配置手册
  19. 2019-12-3 《网络安全法》学习
  20. $(function() {})是什么?

热门文章

  1. POJ 有关动态规划的题目
  2. 机器学习个人资料整理
  3. [生存志] 第20节 历代大事件概览 隋朝
  4. 2021西湖论剑 Re wp
  5. 【存储数据恢复】esx vmfs的互斥导致存储数据丢失的数据恢复案例
  6. Matlab 自定义colormap
  7. 方舟生存进化服务器存档位置,方舟生存进化如何转移存档
  8. 几种最常见的网站盈利模式分析
  9. PyG搭建GCN前的准备:了解PyG中的数据格式
  10. 因果推断what if