codeforces 780B

来源:互联网 发布:阿里云个人邮箱咋申请 编辑:程序博客网 时间:2024/06/05 09:55

题意:n个人在一条直线上,第I个人在坐标ai处,步行的最大速度为vi(单位m每s),他们能往左或往右走,求出他们能够在一点相遇的最小时间

思路:二分枚举时间t,判断他们所能到达的边界,有交集的不断将区间相交,只要有一个没有交集说明这个时间不能到达同一点。

题目:http://codeforces.com/problemset/problem/780/B

#include<cstdio>#include<algorithm>#define ll long longusing namespace std;const int maxn = 100000+10;int a[maxn];int v[maxn];int n;bool check(double t){double left=a[0]*1.0-t*v[0];double right=a[0]*1.0+t*v[0];for(int i=1;i<n;i++){double l=a[i]*1.0-t*v[i]*1.0;double r=a[i]*1.0+t*v[i]*1.0;if(l>right||r<left)return false;left=std::max(left,l);right=std::min(right,r);}return true;}int main(){while(~scanf("%d",&n)){for(int i=0;i<n;i++)scanf("%d",&a[i]);for(int i=0;i<n;i++)scanf("%d",&v[i]);double l=0,r=1e9;while(r-l>1e-6){double mid=(r+l)/2;if(check(mid)){r=mid;}else{l=mid;}}printf("%.8lf\n",r);}}