[Tyvj2053]&&[Nescafé29] 穿越七色虹

描述 Description

探险队员们跟随两位护法来到了七色虹前。七色虹,就是平面直角坐标系中赤橙黄绿青蓝紫七个半圆,第 i 座 (1<=i<=7) 半圆形彩虹的圆心是(xi,0),半径是 ri,半圆上所有点的纵坐标均为非负数。探险队员可以看做一条竖直的、长度等于身高的线段,线段的底端纵坐标为 0,最高的一位探险队员的身高为 h。

现在探险队员们要从 (0,0) 穿越七色虹到达(x0,0),穿越七色虹的过程中,探险队员的整个身体必须始终在至少一个半圆形彩虹的内部。由于彩虹的半径 ri 可能太小了,不足以满足这个条件,因此两位护法决定帮助他们把所有彩虹的半径都增大一个非负实数 r。探险队员们想知道,r 最小是多少呢?

输入格式 InputFormat

第一行两个实数 h、x0,表示身高和目的地横坐标。
接下来七行每行两个实数 xi、ri,表示七座半圆形彩虹的圆心和半径。

输出格式 OutputFormat

输出最小的 r,四舍五入保留 2 位小数。

样例输入 SampleInput

4.0 36.0
0.0 4.0
6.0 4.0
12.0 4.0
18.0 4.0
24.0 4.0
30.0 4.0
36.0 4.0

样例输出 SampleOutput

1.00

数据范围和注释 Hint

对于 100% 的数据,满足 0<=xi,x0<=10000,0 #include #include #include #include using namespace std; int i,j,t,n,m,k,z,y,x; inline void read(int &x) { x=0;char ch=getchar(); while (ch<‘0’ || ch>‘9’) ch=getchar(); while (ch>=‘0’ && ch<=‘9’) x=x10+ch-‘0’,ch=getchar(); } double l,r,H,X[8],R[8],ans; struct cover { double l,r; }c[8]; inline double getz(double x,double y) { return sqrt(xx+yy); } inline double getx(double y,double z) { return sqrt(zz-y*y); } bool ok(double x) { if (x>=X[0]) return true; int i,j,t; double tmp=x; for (i=1;i<=n;i++) if (c[i].l<=x && c[i].r>tmp) tmp=c[i].r; if (tmp>x) return ok(tmp); else return false; } bool can(double x) { int i,j,t; double tmp; double r[8]; memset(c,0.0,sizeof(c)); for (i=1;i<=n;i++) r[i]=R[i]+x; for (i=1;i<=n;i++) { tmp=getx(H,r[i]); c[i].l=X[i]-tmp;c[i].r=X[i]+tmp; } if (ok(0.0)) return true; else return false; } int main() { n=7; //freopen(“rainbow.in”,“r”,stdin); //freopen(“rainbow.out”,“w”,stdout); scanf(“%lf%lf”,&H,&X[0]); for (i=1;i<=n;i++) scanf(“%lf%lf”,&X[i],&R[i]); l=0.0;ans=r=getz(X[0],H); while (l<r) { double mid=(l+r)/2; if (can(mid)) ans=min(ans,mid),r=mid-0.001; else l=mid+0.001; } printf(“%.2lf”,ans); return 0; } ```