题解:CF780B The Meeting Place Cannot Be Changed

这道题一看就是 二分 板子题。

当然由于精度原因,最好由原来的二分模板转换成这个。

while ((w - t) > 0.000001) {
		mid = (t + w) / 2.0 ;
		if (check (mid))  w = mid ;
		else  t = mid ;
	}

至于 check 函数,十分简单。二分出的时间 \(t\),先计算每个人能够到达的区间 \([x_i-tv_i \ ,\ x+tv_i]\),再判断是否有公共交集。

判断公共交集更简单,算出最小区间 \(mi\) 和最大区间 \(ma\),如果最大交集 \(ma\) 小于等于最小交集 \(mi\),则成立。

放出代码:

#include <bits/stdc++.h>
#define int long long
using namespace std ;
int n ;
double a [60010] , b [60010] , mid , t , w , bao ;
bool check (double x) {
	double ma = 0 , mi = 2e9 ;
	for (int i = 1 ; i <= n ; i ++) {
		mi = min (mi , a [i] + b [i] * x) ;
		ma = max (ma , a [i] - b [i] * x) ;
	}
	return ma <= mi ;
	return 0 ;
}
main () {
	ios::sync_with_stdio (false) ;
	cin.tie (NULL) ; cout.tie (NULL) ;
	cin >> n ;
	for (int i = 1 ; i <= n ; i ++)  
		cin >> a [i] , w = max (w , a [i]) ;
	for (int i = 1 ; i <= n ; i ++)  cin >> b [i] ;
	t = 0 ; 
	while ((w - t) > 0.000001) {
		mid = (t + w) / 2.0 ;
		if (check (mid))  w = mid ;
		else  t = mid ;
	}
	printf ("%.12lf" , t) ;
	return 0 ;
}

注意:由于精度原因,样例数据会差大概 \(\pm 0.1\) 左右,这样子也算对的。

posted @ 2024-07-20 16:46  hanciyang  阅读(25)  评论(0)    收藏  举报  来源