【未完成】二分:【SSL】1601.开车出行——2021-03-19更

【未完成】【SSL】1601.开车出行

题目:

为了缓解交通压力,某国脑洞大开,竟然成功研发出了空中汽车。
为了保证夜间行驶的安全,在各个路段安装了一系列路灯进行照明。已知路灯的照明范围是一个以路灯所在的点为顶点的道路最低的直线为底边的等腰直角三角形。汽车的行驶区域必须有路灯的照明。我们为了简化问题将道路简化为一条直线。建立平面直角坐标系,并定义道路的最低点所在的直线为x轴。
现在给定所有路灯在直角坐标系的位置以及一个车辆需要从点a行驶到点b。问这辆汽车所能行驶的最高高度。

如下图所示: 三个路灯的坐标分别为(1 , 1),(3 , 2),(5,1),汽车从2开到5的最高高度为 0.5。
在这里插入图片描述
输入
第一行一个整数n表示路灯的数量。

接下来n行每行两个整数(x,y)表示第i个路灯所在的位置。

第n+2行两个整数x1,x2 表示a,b两点的x坐标位置。

数据保证n<=100000 所有的坐标均为整数且绝对值小于等于10000

输出
一个数表示能够行驶的最高高度。

精确到小数点后三位小数。

输入样例
3
1 1
3 2
5 1
2 5

输出样例
0.500

思路:

这道题目除了实数二分之外还涉及到一些数学知识,我一开始做的时候想着check函数用while循环来做,每次都把当前这个路灯在x高度能照到的范围求出来,然后再去和当前车的所在位置比较,然后换位置,在判断他是否已经到达目的地。但我一直都没找到错的原因。

代码:

#include<bits/stdc++.h>
using namespace std;
struct ld
{
    
    
	double h,l;
}a[100010];
int n;
double x1,x2;

bool chk(double x)
{
    
    
	 int k=1;
	 double s,s2,c=x1;//s存当前这个路灯在x高度的最左侧的位置 ,s2存最右,c是车当前位置 
	 while(1)
	 {
    
    
	 	s=a[k].l-a[k].h+x;//找x高度时灯所能照到的范围
	 	s2=2*a[k].h+s-2*x;
		if(c>=s&&c<=s2)
			c=s2;
		if(c>=x2)
			return true;
		k++;
		if(k>n)
	 		break;
	 }
	 return false;
}
bool cmp(ld q,ld p)
{
    
    
	if(q.h==p.h)
		return q.l>p.l;
	return q.h>p.h;	
}
int main()
{
    
    
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i].l>>a[i].h;
	cin>>x1>>x2;
	sort(a+1,a+1+n,cmp);
	double y=100000,z=0;
	while(y-z>1e-4)
	{
    
    
		double m=(z+y)/2;
		if(chk(m))
			z=m;
		else
			y=m;
	}
	cout<<fixed<<setprecision(3)<<z;
	return 0;
}

在线求助

这道题我真的做不出来,哪位大佬有空帮我看一下我哪做错了,谢谢。