【题目描述】:
在Nescafe27和28中,讲述了一支探险队前往Nescafe之塔探险的故事……
当两位探险队员以最快的时间把礼物放到每个木箱里之后,精灵们变身为一缕缕金带似的光,簇簇光芒使探险队员们睁不开眼睛。待一切平静下来之后,探险队员来到了一座宫殿中,玉制的石椅上坐着两个人……
“你们就是……Nescafe之塔护法中的两位?”
“是的,我们就是神刀护法xlk和飞箭护法riatre……你们来这里做什么?”
“我们是前来拜访圣主和四位护法的……”
“如果你们想见圣主和其它两位护法,你们必须穿过前方的七色彩虹。请随我来吧……”
探险队员们跟随两位护法来到了七色虹前。七色虹,就是平面直角坐标系中赤橙黄绿青蓝紫七个半圆,第i座(1<=i<=7)半圆形彩虹的圆心是(xi,0),半径是ri,半圆上所有点的纵坐标均为非负数。探险队员可以看做一条竖直的、长度等于身高的线段,线段的底端纵坐标为0,最高的一位探险队员的身高为h。
现在探险队员们要从(0,0)到达(x0,0),穿越彩虹的过程中,探险队员的整个身体必须始终在至少一个半圆形彩虹的内部。由于彩虹的半径ri可能太小了,不足以满足这个条件,因此两位护法决定帮助他们把所有彩虹的半径都增大一个非负实数r。探险队员们想知道,r最小是多少呢?
【输入描述】:
第一行两个实数h、x0,表示身高和目的地横坐标。
接下来七行每行两个实数xi、ri,表示七座半圆形彩虹的圆心和半径。
【输出描述】:
输出最小的r,四舍五入保留2位小数。
【样例输入】:
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
【样例输出】:
1.00
【时间限制、数据范围及描述】:
时间:1s 空间:64M
对于 100% 的数据,满足0<=xi,x0<=10000,0<h<100。
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <queue> 6 #include <stack> 7 #include <vector> 8 #include <iostream> 9 #include "algorithm" 10 using namespace std; 11 typedef long long LL; 12 const int MAX=10; 13 int a[MAX]; 14 struct Node{ 15 double x,y; 16 bool operator <(const Node &tt) const { 17 return x<tt.x; 18 } 19 }sst[MAX]; 20 double h,xx; 21 bool feasible(double x){ 22 int i,j;double r[MAX]; 23 for (i=1;i<=7;i++){ 24 double zt=(sst[i].y+x)*(sst[i].y+x)-h*h; 25 if (zt<0) 26 r[i]=0; 27 else 28 r[i]=sqrt(zt); 29 } 30 Node cc[MAX]; 31 for (i=1;i<=7;i++){ 32 cc[i].x=sst[i].x-r[i]; 33 cc[i].y=sst[i].x+r[i]; 34 } 35 sort(cc+1,cc+8); 36 double now=0.0; 37 for (i=1;i<=7;i++){ 38 if (now>xx) return true; 39 if (now<cc[i].x) 40 return false; 41 now=max(now,cc[i].y); 42 } 43 if (now<xx) return false; 44 return true; 45 } 46 int main(){ 47 freopen ("rainbow.in","r",stdin); 48 freopen ("rainbow.out","w",stdout); 49 int i,j; 50 scanf("%lf%lf",&h,&xx); 51 for (i=1;i<=7;i++) 52 scanf("%lf%lf",&sst[i].x,&sst[i].y); 53 double low,high,mid; 54 low=0,high=xx; 55 while (high-low>0.0000001){ 56 mid=(low+high)/2.0; 57 if (feasible(mid)) 58 high=mid; 59 else 60 low=mid; 61 } 62 printf("%.2lf",low); 63 return 0; 64 }