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. Tensorflow源码编译,解决tf提示未使用SSE4.1 SSE4.2 AVX警告【转】

    本文转载自:https://blog.csdn.net/iTaacy/article/details/72799833 版权声明:欢迎转载,转载请注明出处! https://blog.csdn.net ...

  2. HDU 2955 Robberies(概率DP,01背包)题解

    题意:给出规定的最高被抓概率m,银行数量n,然后给出每个银行被抓概率和钱,问你不超过m最多能拿多少钱 思路:一道好像能直接01背包的题,但是有些不同.按照以往的逻辑,dp[i]都是代表i代价能拿的最高 ...

  3. HDU 4725 The Shortest Path in Nya Graph(最短路建边)题解

    题意:给你n个点,m条无向边,每个点都属于一个层,相邻层的任意点都能花费C到另一层任意点,问你1到n最小路径 思路:没理解题意,以为每一层一个点,题目给的是第i个点的层数编号.这道题的难点在于建边,如 ...

  4. 论文笔记——N2N Learning: Network to Network Compression via Policy Gradient Reinforcement Learning

    论文地址:https://arxiv.org/abs/1709.06030 1. 论文思想 利用强化学习,对网络进行裁剪,从Layer Removal和Layer Shrinkage两个维度进行裁剪. ...

  5. 初始化 Flask 虚拟环境 命令

    参考:<Flask Web开发> 系统:Mac OSX CMD // 激活环境 virtualenv venv source venv/bin/activate // 安装flask pi ...

  6. BZOJ 3930 【CQOI2015】 选数

    题目链接:选数 这种SB题我都Wa飞了,彻底没救系列- 首先,我们可以发现1,如果我们选了两个不同的数,那么它们的\(\gcd\)不会超过\(r-l+1\).于是,我们可以设一个\(f_i\)表示任取 ...

  7. 【转】使用sklearn做特征工程

    1 特征工程是什么? 有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已.那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中 ...

  8. 浅谈webpack优化

    webpack优化方案 1. 优化开发体验 1-1. 加快构建速度 ① 缩小文件搜索范围 由于 Loader 对文件的转换操作很耗时,需要让尽可能少的文件被 Loader 处理,用include和ex ...

  9. [javascript]javascript取得html元素,取得html样式,修改html样式

    一.取得html元素 详情见:https://www.jb51.net/article/116460.htm 1.通过ID获取(getElementById) document.getElementB ...

  10. Java IO流-标准输入输出流

    2017-11-05 19:13:21 标准输入输出流:System类中的两个成员变量. 标准输入流(public static final InputStream in):“标准”输入流.此流已打开 ...