D. As Fast As Possible (数学:公式推导)

  • 题目链接:http://codeforces.com/contest/701/problem/D
  • 题意:给你5个整数:人数n,起点到终点的距离 l,人行走的速度 v1,车的速度 v2,车的座位数 k。人和车同时从起点出发,车每次能载k个人,每个人只能坐一次车,忽略车掉头以及乘客上下车的时间,问所有人到终点所需要的最短时间?
  • 思路:因为是求所有人到终点的最短时间,所以,所有人应该是同时到达终点的。并且每个人都是一段路坐车,一段路走路,且坐车行进的距离都相等。
    • 设坐车的距离为 l1 ,则行走的距离就是 l - l1
    • 将每次坐车的人分组,则可以分成 cnt = (n+k-1)/k 组。
      • 第一组人的上车地点在 d1 = 0 处,车前进 l1 再返回
      • 设第二组人的上车地点为 d2 ,车前进 l1t1 = l1 / v2, 车返回时接到第二组人需 t2 = (l1 - t1*v1)/(v1+v2) 。则 d2 = v1*(t1+t2) = 2*v1*l1/(v1+v2)。接到第二组人以后再前进 l1
      • 设第三组人上车的地点为 d3,由于过程和接第二组人时相同,所以 d3 - d2 = d2 - d1
      • 由此得出规律:最后一组人上车的地点为 2*v1*l1*(cnt-1)/(v1+v2)。并且因为是最小时间,所以最后一组人直接在终点下车。即其上车地点又等于 l - l1。联立可求得 l1
    • ans = l1/v2 + (l - l1)/v1

#include <bits/stdc++.h>
#define pi acos(-1)
#define se second
#define fi first
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int INF = 1e9+7;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 1e5 + 10 ;
const LL mod = 1e9+7;



int main()
{
    fastio;
    LL n, l, v1, v2, k;
    cin >> n >> l >> v1 >> v2 >> k;
    LL cnt = (n+k-1)/k;
    long double l1 = (long double)(l*(v1 + v2))/(2*(cnt-1)*v1 + v1 + v2);
    long double ans = l1/v2 + (l-l1)/v1;
    cout << fixed << setprecision(15) << ans << endl;
}

猜你喜欢

转载自blog.csdn.net/qq_37352710/article/details/81780606