http://www.lydsy.com/JudgeOnline/problem.php?id=1185

题解去看它

http://www.cnblogs.com/TheRoadToTheGold/p/8253800.html

精度真是卡的我醉生梦死,w(゚Д゚)w    O(≧口≦)O

bzoj改成long double 就过了

洛谷仍处于

输出x.99999,答案输出x+1.00000

输出-0.00000,答案输出0.00000

救命啊~~~~(>_<)~~~~

来自大佬的建议:输出double时用%f

#include<cmath>
#include<cstdio>
#include<algorithm> #define N 50001 using namespace std; const long double eps=1e-; int dcmp(long double x)
{
if(fabs(x)<eps) return ;
return x< ? - : ;
} struct Point
{
long double x,y; Point(long double x=,long 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]; Point AnsP[]; Vector operator + (Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); }
Vector operator - (Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); }
Vector operator * (Vector A,double q) { return Vector(A.x*q,A.y*q); } long double Cross(Vector A,Vector B)
{
return A.x*B.y-A.y*B.x;
} long double Area2(Point A,Point B,Point D)
{
return Cross(B-A,D-A);
} long double Dot(Vector A,Vector B)
{
return A.x*B.x+A.y*B.y;
} long 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;
} long double getdis(Point A,Point B)
{
return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
} void RotatingCaliper(Point *c,int m)
{
long double AnsArea=1e20,AnsPeri=1e20;
int q=,l=,r=;
long double d,h,w,rw;
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;
rw=Dot(c[r]-c[p],c[p+]-c[p])/d;
if(w*h<AnsArea)
{
AnsArea=w*h;
AnsP[]=c[p]+(c[p+]-c[p])*(rw/d);
AnsP[]=AnsP[]+(c[r]-AnsP[])*(h/getdis(c[r],AnsP[]));
AnsP[]=AnsP[]+(c[q]-AnsP[])*(w/getdis(c[q],AnsP[]));
AnsP[]=AnsP[]+(c[l]-AnsP[])*(h/getdis(c[l],AnsP[]));
}
}
double out=AnsArea;
printf("%.5lf\n",out);
} bool less(Point A,Point B)
{
if(!dcmp(A.y-B.y)) return A.x<B.x;
return A.y<B.y;
} int main()
{
int n,m;
scanf("%d",&n);
double x,y;
for(int i=;i<n;++i)
{
scanf("%lf%lf",&x,&y);
P[i]=Point(x,y);
}
m=ConvexHull(P,n,C);
RotatingCaliper(C,m);
int s=;
for(int i=;i<;++i)
if(less(AnsP[i],AnsP[s])) s=i;
double outx,outy;
for(int i=;i<;++i)
{
if(!dcmp(AnsP[(i+s)%].x)) AnsP[(i+s)%].x=;
if(!dcmp(AnsP[(i+s)%].y)) AnsP[(i+s)%].y=;
outx=AnsP[(i+s)%].x+eps;
outy=AnsP[(i+s)%].y+eps;
printf("%.5lf %.5lf\n",outx,outy);
}
}

bzoj千题计划209:bzoj1185: [HNOI2007]最小矩形覆盖的更多相关文章

  1. BZOJ1185[HNOI2007] 最小矩形覆盖(旋转卡壳)

    BZOJ1185[HNOI2007] 最小矩形覆盖 题面 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形,输出所求矩形的面积和四个顶点的坐标 分析 首先可以先求凸包,因为覆盖了凸包上的顶点,凸 ...

  2. bzoj1185 [HNOI2007]最小矩形覆盖 旋转卡壳求凸包

    [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 2081  Solved: 920 ...

  3. BZOJ1185 [HNOI2007]最小矩形覆盖 【旋转卡壳】

    题目链接 BZOJ1185 题解 最小矩形一定有一条边在凸包上,枚举这条边,然后旋转卡壳维护另外三个端点即可 计算几何细节极多 维护另外三个端点尽量不在这条边上,意味着左端点尽量靠后,右端点尽量靠前, ...

  4. [BZOJ1185][HNOI2007]最小矩形覆盖-[凸包+旋转卡壳]

    Description 传送门 Solution 感性理解一下,最小矩形一定是由一条边和凸包上的边重合的. 然后它就是模板题了..然而真的好难调,小于大于动不动就打错. Code #include&l ...

  5. 2018.10.18 bzoj1185: [HNOI2007]最小矩形覆盖(旋转卡壳)

    传送门 不难看出最后的矩形一定有一条边与凸包某条边重合. 因此先求出凸包,然后旋转卡壳求出当前最小矩形面积更新答案. 代码: #include<bits/stdc++.h> #define ...

  6. BZOJ1185 : [HNOI2007]最小矩形覆盖

    求出凸包后,矩形的一条边一定与凸包的某条边重合. 枚举每条边,求出离它最远的点和离它最左最右的点,因为那三个点是单调变化的,所以复杂度为$O(n)$. 注意精度. #include<cstdio ...

  7. BZOJ1185 HNOI2007 最小矩形覆盖 凸包、旋转卡壳

    传送门 首先,肯定只有凸包上的点会限制这个矩形,所以建立凸包. 然后可以知道,矩形上一定有一条边与凸包上的边重合,否则可以转一下使得它重合,答案会更小. 于是沿着凸包枚举这一条边,通过旋转卡壳找到离这 ...

  8. 【BZOJ1185】[HNOI2007]最小矩形覆盖(凸包,旋转卡壳)

    [BZOJ1185][HNOI2007]最小矩形覆盖(凸包,旋转卡壳) 题面 BZOJ 洛谷 题解 最小的矩形一定存在一条边在凸包上,那么枚举这条边,我们还差三个点,即距离当前边的最远点,以及做这条边 ...

  9. 洛谷 P3187 BZOJ 1185 [HNOI2007]最小矩形覆盖 (旋转卡壳)

    题目链接: 洛谷 P3187 [HNOI2007]最小矩形覆盖 BZOJ 1185: [HNOI2007]最小矩形覆盖 Description 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形, ...

随机推荐

  1. jenkis +sonarqube 对后端代码静态扫描,钉钉群通知执行结果(记录)

    代码提交,触发后端sonar测试,测试完成,jenkins触发依赖任务,执行python脚本,达到预期,调用上线任务模块,进行上线,达不到预期,钉钉群通知. 牵涉到配置: 1.配置sonar测试任务 ...

  2. Jq_打印

     利用IE自带的WebBrowser进行打印  打印判断: if(factory.object)//打印设置的判断 factory.printing.PageSetup(); else alert(& ...

  3. p4语言编程环境安装

    p4语言主要是用来模拟交换机的交互,是新一代的SDN解决方案,可以让数据转发平面也具有可编程能力,让软件能够真正定义网络和网络设备.详细介绍 主要流程是:安装vmware.安装Ubuntu.下载Git ...

  4. PHP学习 类型 变量 常数 运算符

    PHP支持下列8种类型 标量类型 scalar type整数 integer浮点数 float double布尔 boolean字符串 string 特殊类型 special typeNULL资源 r ...

  5. android listview addheaderview viewpager

    just set viewPager's onTouchListener,like this: viewPager.setOnTouchListener(new OnTouchListener() { ...

  6. Centos6.5下进行PHP版本升级

    http://blog.csdn.net/aliveqf/article/details/70444387

  7. Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理

    Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理 计算机工作原理 汇编指令 C语言代码汇编分析 by苏正生 原创作品转载请注明出处 <Linux内核分析>MOOC课程htt ...

  8. Leetcode题库——49.字母异位词分组【##】

    @author: ZZQ @software: PyCharm @file: leetcode49_groupAnagrams.py @time: 2018/11/19 13:18 要求:给定一个字符 ...

  9. week6:个人博客作业

    这周主要是参与团队编程的讨论 团队编程中发现很多问题: 1,每个人共同空闲的时间不好找 就我组来说,我是考研,每天晚上都要去外面上课,有的人在进行大创,,也有的像我一样在整考研的东西,还有的进行其他, ...

  10. [转帖]Kubernetes及容器编排的总体介绍【译】

    Kubernetes及容器编排的总体介绍[译] 翻译自The New Stack<Kubernetes 生态环境>作者:JANAKIRAM MSV和 KRISHNAN SUBRAMANIA ...