codeforces 782B - The Meeting Place Cannot Be Changed

time limit per test
5 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

The main road in Bytecity is a straight line from south to north. Conveniently, there are coordinates measured in meters from the southernmost building in north direction.

At some points on the road there are n friends, and i-th of them is standing at the point xi meters and can move with any speed no greater than vi meters per second in any of the two directions along the road: south or north.

You are to compute the minimum time needed to gather all the n friends at some point on the road. Note that the point they meet at doesn't need to have integer coordinate.

Input

The first line contains single integer n (2 ≤ n ≤ 60 000) — the number of friends.

The second line contains n integers x1, x2, ..., xn (1 ≤ xi ≤ 109) — the current coordinates of the friends, in meters.

The third line contains n integers v1, v2, ..., vn (1 ≤ vi ≤ 109) — the maximum speeds of the friends, in meters per second.

Output

Print the minimum time (in seconds) needed for all the n friends to meet at some point on the road.

Your answer will be considered correct, if its absolute or relative error isn't greater than 10 - 6. Formally, let your answer be a, while jury's answer be b. Your answer will be considered correct if  holds.

Examples
input
3
7 1 3
1 2 1
output
2.000000000000
input
4
5 10 3 2
2 3 2 4
output
1.400000000000

#include<cstdio>
struct type{
	int x;
	int v;
}p[60000+5];
int n;
bool check(double time)
{
	//遍历每个人在time个单位时间后能走到的位置,不断更新重叠的区间[l,r],只要到最后这个区间一人不为空,就return true 
	double l=p[1].x-time*p[1].v;
	double r=p[1].x+time*p[1].v;
	for(int i=2;i<=n;i++){
		if(p[i].x-time*p[i].v > l) l=p[i].x-time*p[i].v;
		if(p[i].x+time*p[i].v < r) r=p[i].x+time*p[i].v;
		if(l>r) return false;
	}
	return true;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&p[i].x);
	for(int i=1;i<=n;i++) scanf("%d",&p[i].v);
	double st=0,ed=1000000000;
	while(ed-st>1e-7){
		double mid=st+(ed-st)/2;
		if(check(mid)) ed=mid;
		else st=mid;
	}
	printf("%.12lf\n",ed);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值