题意 : 在一条横线,n 个人, 每个有对应的速度,可以向两边走。问,这n个人到某点集合的最小时间。
枚据时间 time,则对i人能到的范围为(x[i] + v[i]*time, x[i] - v[i]*time)。然后看所有人能到的范围是否有交集。如果有交集 ,说明他们能在时间t内到某点集合。
#include <bits/stdc++.h>using namespace std;int x[70005],v[70005],n;bool canmeet(double time){ double left,right; for(int i=1;i<=n;i++) { if(i==1) { right = x[i] + v[i]*time; left = x[i] - v[i]*time; } else { double ri = x[i] + time*v[i]; double le = x[i] - time*v[i]; if( le > right || ri < left ) { return false; } left = max(le ,left); // 维持最大的左边 值 right = min(right, ri); // 维持最小的右边 值 } } return true;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",x+i); for(int i=1;i<=n;i++) scanf("%d",v+i); double l = 0, r = 1e9; while(r-l>1e-6) { double mid = (r+l)/2; if(canmeet(mid)) { r = mid; } else l = mid; } PRintf("%.7lf/n",r); return 0;}新闻热点
疑难解答