题目
题意
已知n个人,一段路程为 l,走路v1,坐车v2,每车最多坐k人(每人最多做一次车),求所有人到终点的最小时间。上下车不需要时间,车转弯不需要时间,但是只有一辆车,车回去需要时间。
思路
所有人到达终点的时间是一样的。所以每个人坐车行走的距离都是一样的.
第一组上车的人在0处上车,设在坐车行走距离 l1 然后下车。
第二组此时走到了l1/v2*v1
, 人和车此时相距(l1-l1/v2*v1)
设第二组上车的位置是d。
d=l1/v2*v1+(l1-l1/v2*v1)/(v1+v2)=2*l1*v1/(v1+v2)。
第二组也要坐车行走 l1,同样第三组上车的位置是 d+d(假设把原点设置为d 第二组看成第一组 第三组看成第一组)
共要分成cnt=n/k+(n%k?1:0),k=2*(cnt-1);//cnt是车需要接几趟人 组
。
最后一组上车的位置应该是l-l1.(最后一趟车直达终点 和别人都一起到达)
(cnt-1)*2*l1*v1/(v1+v2)=l-l1
求出l1. 所有人到达终点的时间是ans=l1/v2+(l-l1)/v1
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k,cnt;double l,v1,v2;scanf("%d%lf%lf%lf%d",&n,&l,&v1,&v2,&k);
cnt=n/k+(n%k?1:0),k=2*(cnt-1);//cnt是车需要接几趟人
double l1=l*(v1+v2)/(k*v1+v1+v2);//第一组上车走的距离.
double ans=l1/v2+(l-l1)/v1;
printf("%.10f\n",ans);
}