题目描述

数轴上有nn个人,他们要选一个地点集合。
ii个人初始在位置aia_i上,他的移速最大是bib_i单位/秒,请问最少需要花费多少秒,这nn个人可以在某一个点集合。

对于100%100\%的数据,保证1n100000,1ai,bi1000001≤n≤100000,1≤a_i,b_i≤100000

分析

二分答案

寻找最少时间MM满足这nn个人的可移动区间存在交集。

可移动区间是[aibi×M,ai+bi×M][a_i-b_i×M,a_i+b_i×M]

alt

边界

最短时间即所有人都在一个点上,不用移动即时间为00
最长时间即两个人分别在两端,且移动速度最慢为11,时间为5000050000

AC代码

/*
有 n 个人,他们要选一个地点集合。第 i 个人初始在位置 ai 上,他的移速最大是 bi 单位/秒,
请问最少需要花费多少秒,这 n 个人可以在某一个点集合。
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int n,a[maxn],b[maxn];
bool check(double x){
	double L=-1e10,R=1e10;
	for(int i=1;i<=n;i++){
		double l=a[i]-x*b[i];
		double r=a[i]+x*b[i];
		L=max(L,l);R=min(R,r);
	}
	if(L>R) return false;
	return true;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
	double l=0,r=5e4;
	for(int i=1;i<=100;i++){
		double mid=(l+r)/2;
		if(check(mid)) r=mid;
		else l=mid;
	}
	printf("%.10f",r);
}