思路:根据题目思考很容易得出如果要时间最少,汇合的地点一定在他们的点范围之间,那么我们二分最后汇合的点,看哪边速度比较慢就往哪边靠,最后就能出答案了。下面给代码:
#include<iostream>
#include<cmath>
#include<queue>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
#include<utility>
#include<map>
#define maxn 60005
#define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
const double eps=1e-8;
int x[maxn],v[maxn];
int main(){
int n;
scanf("%d",&n);
int minnum=inf;
int maxnum=0;
for(int i=0;i<n;i++){
scanf("%d",&x[i]);
minnum=min(minnum,x[i]);
maxnum=max(maxnum,x[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&v[i]);
}
double l=minnum,r=maxnum;
double ans=0;
while(l-r<eps){
double mid=(l+r)/2;
double left=0,right=0;
for(int i=0;i<n;i++){
if(x[i]<mid)
left=max(left,(mid-x[i])/v[i]);
else
right=max(right,(x[i]-mid)/v[i]);
}
//printf("%lf\n%lf\n",left,right);
if(left-right<-eps)
l=mid+eps;
else if(fabs(left-right)<eps){
ans=left;
break;
}
else
r=mid-eps;
}
printf("%.12lf\n",ans);
}
最小汇合时间算法
探讨了如何计算多个能在直线上移动的个体以最短时间汇合的问题,采用二分搜索法确定最佳汇合点。
holds.

被折叠的 条评论
为什么被折叠?



