codeforces 700A

给n个人,长度l,人的速度是v1,车的速度是v2,一次车乘k个人。问全都送到目的地的最短时间。

对一个人,要坐车就连着做,然后剩余的时候都在走。

那么,去目的地就是t1,回来就是(v2*t1-v1*t1)/(v1+v2);

然后加上趟数,就能算出来,在一个人要乘这么多时间的车的时候,需要的最少时间。

发现,现在二分的难点在于,给定一个要验证的值的时候,如何用固定的表达式表示出一个和要验证的量可以比较的量。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <cmath>
#include <map>
#include <string>
#include <stack>
#include <queue>

using namespace std;
double eps=1e-6;
double l,v1,v2;
int n,k;
double fun(double x)
{
    int tang=n/k;
    if (n%k!=0) tang++;//去终点的次数
    double t1=(l-v1*x)/(v2-v1);//至少的乘车时间,多了固然好,但是会更加完不成
    if ((tang-1)*(t1*v2-t1*v1)/(v1+v2)+tang*t1<=x) return true;//保证充足的乘车时间基础上,能不能在规定时间内完成这么多趟数。单次多了固然好,但是每一趟负荷大了,更完成不了
    return false;
}
int main()
{
    scanf ("%d%lf%lf%lf%d",&n,&l,&v1,&v2,&k);
    double L=l/v2,R=l/v1;
    while (R-L>eps)
    {
        double mid=(L+R)/2;
        if (fun(mid)) R=mid;
        else L=mid;
    }
    printf ("%.10f\n",L);
    return 0;
}

 

posted on 2016-07-25 20:02  very_czy  阅读(311)  评论(0编辑  收藏  举报

导航