cf701D. As Fast As Possible(小学数学推导)

一道关于n人走路和坐车达到终点的最短时间问题,只有一辆车,每次最多载k人,求所有人同时到达的最小时间。关键在于所有人乘车行驶的距离相同,通过设定上车位置优化路径。
摘要由CSDN通过智能技术生成

题目

在这里插入图片描述

题意

已知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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值