求助 穿越七彩虹
  • 板块题目总版
  • 楼主Wallacewwz
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/4 10:55
  • 上次更新2023/11/3 11:40:57
查看原帖
求助 穿越七彩虹
660883
Wallacewwz楼主2023/7/4 10:55

问题 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;
}
2023/7/4 10:55
加载中...