Description

给定一个a*b*c的长方体,定义其表面上两个点的距离为沿着长方体的表面走的最短路径的长度,请找到距离最远的点对,你需要保证找到的两个点里至少有一个是长方体顶点。

Input

第一行包含三个正整数a,b,c(1<=a,b,c<=1000),即长方体的长、宽、高。

Output

输出一行一个实数,即最远点对的距离,与标准答案的绝对或相对误差不超过10^{-8}时会被认为是正确的。
 
首先长方体的八个顶点等价,所以可以任选一个考虑
显然最远点会在和所选顶点不相邻的三个面中的某一个上
枚举这三个面,画出展开图,
设当前面的长宽为a,b,长方体的长宽高为a,b,c,所选顶点与这个面不相邻
建直角系,使展开图中当前面在0<x<a,0<y<b区域
所选顶点在展开图中有意义的位置可以是(0,-c),(-c,0),(a+c,-a),(-b,b+c)之一
二分答案,问题转化为以这四个点为圆心,答案为半径的圆是否覆盖了整个矩形,这是计算几何的经典问题,可以考虑几种情况:
1.一个圆与矩形无交,可以忽略这个圆
2.一个圆包含了矩形,可以直接判定整个矩形被覆盖
3.否则 整个矩形没有被覆盖 当且仅当 存在一个圆,这个圆上存在一个点满足在矩形内且在其余圆外,可以求出圆之间、圆和矩形的交点判断一下
最后对三个面的答案取max
#include<bits/stdc++.h>
typedef double ld;
ld ans=;
void maxs(ld&a,ld b){if(a<b)a=b;}
const ld _0=1e-;
int T,n;
ld xm,ym,x[],y[],r[];
ld dis2(ld x,ld y){return x*x+y*y;}
ld dis(ld x,ld y){return sqrt(x*x+y*y);}
bool out(int w){
return x[w]+r[w]<||x[w]-r[w]>xm||y[w]+r[w]<||y[w]-r[w]>ym;
}
bool in(int w){
ld r2=r[w]*r[w];
return dis2(x[w],y[w])<r2&&dis2(x[w]-xm,y[w])<r2&&
dis2(x[w],y[w]-ym)<r2&&dis2(x[w]-xm,y[w]-ym)<r2;
}
struct ev{
ld x;
int a;
bool operator<(ev w)const{return x<w.x;}
}es[];
const ld pi=acos(-),_2pi=pi*;
ld fix(ld x){
while(x<)x+=_2pi;
while(x>=_2pi)x-=_2pi;
return x;
}
int s,ep;
void cal(ld a,ld b){
ld l=fix(a-b),r=fix(a+b);
if(l>r)++s;
es[ep++]=(ev){l-_0,};
es[ep++]=(ev){r+_0,-};
}
void f(ld a,ld b,ld c){
xm=a,ym=b;
x[]=-c,y[]=;
x[]=,y[]=-c;
x[]=a+c,y[]=-a;
x[]=-b,y[]=b+c;
ld L=,R=a+b+c,M;
while(R-L>1e-){
M=(L+R)/;
for(int i=;i<;++i)r[i]=M;
bool ed=,ed0=;
for(int i=;i<;++i){
if(out(i))continue;
ed0=;
if(in(i))break;
s=,ep=;
for(int j=;j<;++j)if(j!=i){
ld xd=x[j]-x[i],yd=y[j]-y[i];
ld d=dis(xd,yd);
if(r[j]+r[i]<d+_0)continue;
ld a=atan2(yd,xd),b=acos(d/(*r[i]));
cal(a,b);
}
if(x[i]-r[i]<)cal(pi,acos(x[i]/r[i]));
if(x[i]+r[i]>xm)cal(,acos((xm-x[i])/r[i]));
if(y[i]-r[i]<)cal(pi*1.5,acos(y[i]/r[i]));
if(y[i]+r[i]>ym)cal(pi*0.5,acos((ym-y[i])/r[i]));
if(!ep){ed=;goto o;}
std::sort(es,es+ep);
for(int j=;j<ep;++j)if(!(s+=es[j].a)){ed=;goto o;}
oo:;
}
if(!ed0)ed=;
o:;
if(ed)R=M;
else L=M;
}
maxs(ans,L);
}
int main(){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
f(a,b,c);f(b,c,a);f(c,a,b);
printf("%.10f",ans);
return ;
}

bzoj 4885: [Lydsy2017年5月月赛]长方体的更多相关文章

  1. bzoj 4836: [Lydsy2017年4月月赛]二元运算 -- 分治+FFT

    4836: [Lydsy2017年4月月赛]二元运算 Time Limit: 8 Sec  Memory Limit: 128 MB Description 定义二元运算 opt 满足   现在给定一 ...

  2. BZOJ 4881: [Lydsy2017年5月月赛]线段游戏

    4881: [Lydsy2017年5月月赛]线段游戏 Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 164  Solved: 81[Submit][St ...

  3. BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4883 [题目大意] 在一个n*m的棋盘上要放置若干个守卫. 对于n行来说,每行必须恰好 ...

  4. BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4884 [题目大意] 太空猫(SpaceCat)是一款画面精致.玩法有趣的休闲游戏, 你 ...

  5. 【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 275  Solved: 87 Descripti ...

  6. [补档][Lydsy2017年4月月赛]抵制克苏恩

    [Lydsy2017年4月月赛]抵制克苏恩 题目 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平. 如果你不玩炉石传说,不必担心,小Q同学会告诉你所有相关的细节.炉石传说是这样的一 ...

  7. 【BZOJ4832】[Lydsy2017年4月月赛]抵制克苏恩 概率与期望

    [BZOJ4832][Lydsy2017年4月月赛]抵制克苏恩 Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q同学会告诉 ...

  8. 【BZOJ4883】[Lydsy2017年5月月赛]棋盘上的守卫 KM算法

    [BZOJ4883][Lydsy2017年5月月赛]棋盘上的守卫 Description 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列 必须 ...

  9. [Bzoj4832][Lydsy2017年4月月赛]抵制克苏恩 (期望dp)

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 673  Solved: 261[Submit][ ...

随机推荐

  1. (探讨贴)POJ 1463 树形DP解法的不正确性

    POJ1463是一个典型的树状DP题. 通常解法如下代码所示: using namespace std; ; ]; int pre[maxn]; int childcnt[maxn]; int n; ...

  2. 51Nod 1070 Bash游戏 V4(斐波那契博弈)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈,http://blog.csd ...

  3. Learning Ansible with Vagrant

    介绍 Vagrant介绍 Vagrant是一款构建虚拟开发环境的工具,Vagrant的使用依赖于VirtualBox,VMware等一些虚拟机,通过Vagrant能更加方便的管理虚拟机,同时还能够通过 ...

  4. TCP协议和UDP协议区别

    tcp协议:可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用TCP的应用:Web浏览器:文件传输程序 udp协议:不可靠的.无连接的服务,传 ...

  5. 【Jmeter】配置不同业务请求比例,应对综合场景压测

    背景 在进行综合场景压测时,遇到了如何实现不同的请求所占比例不同的问题. 有人说将这些请求分别放到单独的线程组下,然后将线程组的线程数按照比例进行配置. 这种方法不是很好,因为服务器对不同的请求处理能 ...

  6. ActiveSupport::TimeZone; 功能:用户自行选择时区。

    TimeZone类作为一个包装器,服务一个TZinfo::Timezone 实例. 用途: 134个时区的检索. 使用简化的英文单词来取回和显示时区:如"Beijing" => ...

  7. jQuery实现的手机发送验证码倒计时效果代码分享

    这是一款基于jquery实现的手机发送验证码倒计时效果代码,可实现实时显示秒数倒计时的功能,还可实现对手机号码格式验证的功能,是一款常用的网站注册发送手机验证码特效代码. 效果描述:注册一个网站,当需 ...

  8. 转载-LVS的三种工作模式

    来源地址:http://www.uml.org.cn/zjjs/201211124.asp 1.lvs简介         lvs是一个开源的软件,由毕业于国防科技大学的章文嵩博士于1998年5月创立 ...

  9. 认识Applet和Ajax

    一.Applet 1.Applet的定义:Applet是采用Java编程语言编写的小应用程序,该程序可以包含在HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同. Java写出 ...

  10. /dev/mem直接操作硬件寄存器

    /******************************************************************************* * /dev/mem直接操作硬件寄存器 ...