记录编号 |
48841 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[Nescafé29] 穿越七色虹 |
最终得分 |
100 |
用户昵称 |
Truth.Cirno |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.015 s |
提交时间 |
2012-11-06 18:48:36 |
内存使用 |
3.15 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
int main(void)
{
freopen("rainbow.in","r",stdin);
freopen("rainbow.out","w",stdout);
int i,j,k;
double h,h2,x0,x[7],r[7],cross[16],left=0,mid=50000,right=100000,leftt=0,midt=0,rightt=0,xx,temp;
bool ok,in;
cin>>h>>x0;
h2=h*h;
for (i=0;i<7;i++)
cin>>x[i]>>r[i];
cross[14]=0;
cross[15]=x0;
while (left<=right)
{
if (left==leftt&&right==rightt&&mid==midt)
break;
leftt=left;
rightt=right;
midt=mid;
ok=true;
for (i=0;i<7;i++)
{
temp=pow(r[i]+mid,2.0)-h2;
if (temp>=0)
temp=sqrt(temp);
else
temp=-1;
if (temp>=0)
{
cross[i]=x[i]+temp;
cross[i+7]=x[i]-temp;
}
else
{
cross[i]=0;
cross[i+7]=0;
}
}
for (i=0;ok&&i<16;i++)
for (j=i;ok&&j<16;j++)
{
if ((i!=14&&cross[i]==0)||(j!=14&&cross[j]==0))
continue;
if (i!=j)
xx=(cross[i]+cross[j])/2;
else
xx=cross[i];
if (xx>=0&&xx<=x0)
{
in=false;
for (k=0;k<7;k++)
{
if (pow(xx-x[k],2.0)+h2<=pow(r[k]+mid,2.0))
{
in=true;
break;
}
}
if (!in)
ok=false;
}
}
if (ok)
right=mid;
else
left=mid;
mid=(left+right)/2;
}
printf("%.2lf\n",mid);
return(0);
}