codeforces 700A As Fast As Possible 二分求和?我覺得直接解更好。本站提示廣大學習愛好者:(codeforces 700A As Fast As Possible 二分求和?我覺得直接解更好)文章只能為提供參考,不一定能成為您想要的結果。以下是codeforces 700A As Fast As Possible 二分求和?我覺得直接解更好正文
剖析:一輛車最多載k團體,車的速度一定比人快,所以想要抵達時間最短,那麼每團體必需做一次公交車。那麼把n團體分紅p=(n+k-1)/k組。設最短時間為t,每人乘車時間為t1,則t1*v2+(t-t1)*v1=L。設每次車子前往走的時間為t2,則(t1+t2)*v1+t2*v2=t1*v2。由這兩個式子可以寫出t1,t2的表達式。又由於p*t1+(p-1)*t2=t. 所以可以以最短時間L/v2為左端值,以L/v1為右端值二分t。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int n,k;
double l,v1,v2;
int solve(double t,int p)
{
double t1=(l-t*v1)/(v2-v1);
double t2=(v2-v1)*t1/(v1+v2);
double ans=t1*p+t2*(p-1);
if(ans<t) return 1;
return 0;
}
int main()
{
scanf("%d%lf%lf%lf%d",&n,&l,&v1,&v2,&k);
int p=(n+k-1)/k;
double low=l/v2,high=l/v1;
double mid=(low+high)/2;
while(high-low>0.000001)
{
int ret=solve(mid,p);
if(ret==1)
high=mid;
else
low=mid;
mid=(low+high)/2;//這個中央居然坑了我一把,假如把這一行放置while循環的第一個語句,後果wa了。。。
}
printf("%.10lf\n",mid);
return 0;
}
但是,為什麼要用二分呢,就是由於cf下面有二分這個標簽嘛?明擺著t=p*t1+(p-1)*t2. 所以可以直接求解啊!
#include <cstdio>
#include <cstring>
int main()
{
int n,k;
double v1,v2,l;
scanf("%d%lf%lf%lf%d",&n,&l,&v1,&v2,&k);
int p=(n+k-1)/k;
double a=l*p/(v2-v1)+l*(p-1)/(v1+v2);
double b=v1*p/(v2-v1)+v1*(p-1)/(v1+v2)+1;
printf("%.10lf\n",a/b);
return 0;
}