Codeforces Round #364 (Div. 1) A - As Fast As Possible

来源:互联网 发布:中国菜刀源码 编辑:程序博客网 时间:2024/04/25 20:01

结论为最后几个学生同时到达就是最短时间
贪心证明 当最后一批学生到达之前有学生到达那之前的学生肯定被公交车载的更远那公交车走的距离就更长用的时间就更长那最后一批学生到达的时间也会晚
当最后一批学生比之前的学生提前到达那前一批学生走的时间会比所有学生同时到达的时间更长那也不是最优解
然后二分距离求同时到达的距离和时间

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cmath>using namespace std;int l,v1,v2;int n,k;double ans2;double ok(double len){      double t;      ans2 = len/v2;      int n1 = n;      n1-=min(n1,k);      double len2 = len/v2*v1;//后面的学生      if(!n1)return len;      t = (len-len2)/(v1+v2);      ans2+=t;      len = len+t*v1;      len2  = len2+t*v1;      while(n1)      {          t = (len-len2)/(v2-v1);          ans2+=t;          len = len+v1*t;          len2 = len2+v1*t;          n1-=min(n1,k);          if(!n1)return len;          t = (len-len2)/(v1+v2);          ans2+=t;          len = len+t*v1;          len2  = len2+t*v1;      }      return len;}int main(){    scanf("%d %d %d %d %d",&n,&l,&v1,&v2,&k);    double ans;    double left = 0.0,right = l;    int i1 = 0;    for(int i=0;i<=100;i++)    {        double mid = (left+right)/2.0;        double pre = ok(mid);        i1++;        if(abs(pre-l)<=1e-8)break;        if(pre>l)right = mid;        else if(pre<l)left = mid;    }    printf("%f\n",ans2);    return 0;}
0 0
原创粉丝点击