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; }