问题 A: Rainbow 时间限制: 1 Sec 内存限制: 128 MB 题目描述 七色虹, 就是平面直角坐标系中赤橙黄绿青蓝紫七个半圆,第 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 提示
数据范围与约定
对于 100% 的数据,满足 0<=xi,x0<=10000,0<h<100。
以下是我的代码,但是是错误的,谁能帮我看看
#include <bits/stdc++.h>
//#pragma GCC optimize(2)
#define int long long
#define endl '\n'
//#define ll long long
#define ull unsigned long long
using namespace std;
double pos,h;
double r[8],x[8];
double r_;
double l[8];
bool isin(int p)
{
for(int i = 1; i <= 7; i++)
{
if(x[i]-l[i] <= (p*1.0) && (p*1.0) <= x[i]+l[i])
{
return true;
}
}
return false;
}
bool check(double k)
{
/*
for(int i = 1; i <= 7; i++)
{
r_= r[i]+k;
o[i] = sqrt(r_*r_/2);
cout << o[i] << endl;
if(o[i] < h)return false;
}
for(int i = 0; i <= pos; i++)
{
cout << i << " " << isin(i) << endl;
if(!isin(i))return false;
}
return true;
*/
for(int i = 1; i <= 7; i++)
{
int r_ = r[i]+k;
l[i] = sqrt((r_*r_)-(h*h));
//cout << l[i] << " ";
}
for(int i = 0; i <= pos; i++)
{
//cout << i << " " << isin(i) << endl;
if(!isin(i))return false;
}
return true;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> h >> pos;
//pos+=20000;
for(int i = 1; i <= 7; i++)
{
cin >> x[i] >> r[i];
//x[i]+=20000;
//r[i]+=20000;
}
//cout << check(0.9) << endl;
double ll = 0;
double rr = 114514;
while(rr-ll >= 1e-3)
{
double mid = (ll+rr)/2;
//cout << mid << endl;
//cout << check(mid) << endl;
if(check(mid))rr = mid;
else ll = mid;
}
//cout << fixed << setpricision(2) << ll << endl;
//printf("%.2lf",(double)((int)(ll*100+0.5))/100);
printf("%.2lf\n",ll);
return 0;
}