题目链接:Codeforces Round #403 div2 B. The Meeting Place Cannot Be Changed
题意:
一条直线有n个点,每个点有一个速度,然后将全部的点聚在一起,问最少的时间
题解:
二分答案,然后O(n)check一下能否聚到一起。
check:维护一个左右区间,然后对于每个点能到达的左右最大范围,不停的缩小这个区间就行。
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 typedef pair<int,int>P; 5 const int N=60007; 6 int n; 7 P a[N]; 8 int check(double mid) 9 { 10 double r=a[1].first+a[1].second*mid; 11 double l=a[1].first; 12 F(i,2,n) 13 { 14 double tmpr=a[i].first+a[i].second*mid; 15 double tmpl=a[i].first-a[i].second*mid; 16 if(tmpl>r)return 0; 17 if(tmpl>l)l=tmpl; 18 if(r>tmpr)r=tmpr; 19 } 20 return 1; 21 } 22 23 int main() 24 { 25 scanf("%d",&n); 26 F(i,1,n)scanf("%d",&a[i].first); 27 F(i,1,n)scanf("%d",&a[i].second); 28 sort(a+1,a+1+n); 29 double l=0,r=1e9,mid,ans; 30 F(i,1,200) 31 { 32 mid=(l+r)/2; 33 if(check(mid))ans=mid,r=mid; 34 else l=mid; 35 } 36 printf("%.7f ",ans); 37 return 0; 38 }