记录编号 100172 评测结果 AAAAAAAAAA
题目名称 [Nescafé29] 穿越七色虹 最终得分 100
用户昵称 GravatarHouJikan 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2014-05-03 21:26:59 内存使用 0.31 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <stack>
#include <set>
#include <queue>
#include <functional>
using namespace std;
struct rb
{
  double o,r;
}rainbow[8];
struct ar
{
  double f,t;
}area[8];
double h,x;
bool cmp(ar a,ar b);
void getarea(double upr);
bool check();
int main()
{
  freopen("rainbow.in","r",stdin);
  freopen("rainbow.out","w",stdout);
  
  cin>>h>>x;
  for(int a=1;a<=7;a++)
    cin>>rainbow[a].o>>rainbow[a].r;
  double l=0,r=x;
  while (r-l>0.001)
  {
    double upr=(r+l)/2.0;
    getarea(upr);
    bool done=check();
    if (done)
      r=upr;
    else
      l=upr;
  }
  printf("%.2lf",l);
  return 0;
}
bool cmp(ar a,ar b)
{
  if (fabs(a.f-b.f)<=0.01)
    return a.t>b.t;
  else 
    return a.f<b.f;
}
bool check()
{
  sort(area+1,area+8,cmp);
  double ends=0;
  if (x-ends<0.001)
      return true;
  for(int a=1;a<=7;a++)
  {
    if (area[a].f>ends)
      return false;
    else
      ends=max(area[a].t,ends);
    if (ends-x>0.001)
      return true;
  }
  return false;
}
void getarea(double upr)
{
  for(int a=1;a<=7;a++)
    if(rainbow[a].r+upr-h>=0.001)
    {
       double d=sqrt((rainbow[a].r+upr)*(rainbow[a].r+upr)-h*h);
       area[a].f=rainbow[a].o-d;
       area[a].t=rainbow[a].o+d;
    }
    else
      area[a].f=area[a].t=100001;
}