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

 

转载于:https://www.cnblogs.com/pach/p/6142571.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值