CF700A As Fast As Possible 题解

题意

\(n\) 个人想要到 \(l\) 米远的地方,他们的走路速度为 \(v1\) ,现在有一辆车,最多坐 \(k\) 人,速度为 \(v2\) ,每个人最多上一次车,问这些人都到达的最早时间。

分析

一道经典的小学奥数题。题目中“这些人都到大的最早时间”是最后一个人到达的时间,因此我们要尽量让每一批的人同时到达,并且保证一直有一批人在坐车,且坐满了。设每批人坐车 \(x\) 千米,坐车和步行一次走的总路程是 \(2\times x\),速度和是 \(v1+v2\) 。设共分为 \(p\) 批,\(p=\lceil {n/k}\rceil \) ,每批人步行的总时间是 \((p-1)\times(2 \times x \div (v1+v2))\) ,每批人步行的总路程是 \(v1\times (p-1)\times (2\times x\div (v1+v2))\) 。表示出了每批人步行的总路程,又知道坐车的总路程是 \(x\) ,所以我们可以列出方程
\(s=x+v1\times (p-1)\times (2\times x\div (v1+v2))\),解得\(x=s\times (v1+v2)\div (2\times v1\times (p-1)+v1+v2)\),然后 就可以得出最短时间。

代码

#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a));
#define elif else if
#define endl4 endl<<endl<<endl<<endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const ld EPS=1e-8;
const ll INF=1e18+7;
const int inf=1e9+7;
inline ll llmax(ll x,ll y){return x>y?x:y;}
inline ll llmin(ll x,ll y){return x<y?x:y;}
inline ll llgcd(ll x,ll y){return (y==0?x:llgcd(y,x%y));}
inline ll lllcm(ll x,ll y){return x*y/llgcd(x,y);}
inline int gcd(int x,int y){return (y==0?x:llgcd(y,x%y));}
inline int lcm(int x,int y){return x*y/gcd(x,y);}
double n,s,v1,v2,k;
int main()
{
    scanf("%lf%lf%lf%lf%lf",&n,&s,&v1,&v2,&k);
    int p=ceil(n/k); // 分的批数
    double x=s*(v1+v2)/(2*v1*(p-1)+v1+v2); // 算出每批人坐车的时间
    printf("%.6lf",(s-x)/v1+x/v2); // 按照题意输出最短时间
    return 0;
}
posted @ 2022-02-18 11:14  l_x_y  阅读(50)  评论(0编辑  收藏  举报