Discrete Acceleration(浮点数二分)

题目链接: Discrete Acceleration

大致题意:

有一条路长为l, 起始于0, 结束于l. 这条路上有A和B两个人, 起初A在起点(0), B在终点(l). 两个人相向而行, 初始速度均为1.

路上有n个加速点, 分别位于ai处, 每当有人经过加速点时, 这个人的速度就会加1. 问经过多长时间后两个人可以相遇.

解题思路:

二分答案即可, 最坏最坏也可以在l/2的时间相遇. 则一定存在一个时间t(0<=t<=l/2), 使得res = [t, l/2]均满足题意, 而我们需要得到的是答案区间的左端点, 进行左端点二分操作即可.

AC代码:

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= n; ++i)
using namespace std;
typedef long long ll;
const int N = 1E5 + 10;
int a[N];
int n, m;
bool judge(double t) {
    int s1 = 1; double t1 = t, index1 = 0;
    for (int i = 1; i <= n; ++i) {
        if (index1 >= m) return 1;
        double temp = (a[i] - index1) / s1; //跑到下个点需要的时间
        if (t1 >= temp) t1 -= temp, index1 = a[i], s1++;
        else break;
    }
    index1 += t1 * s1;
    
    int s2 = 1; double t2 = t, index2 = m;
    for (int i = n; i >= 1; --i) {
        if (index2 <= index1) return 1;
        double temp = (index2 - a[i]) / s2;
        if (t2 >= temp) t2 -= temp, s2++, index2 = a[i];
        else break;
    }
    index2 -= t2 * s2;
    
    return index2 <= index1;
}
int main()
{
    int t; cin >> t;
    while (t--) {
        scanf("%d %d", &n, &m);
        rep(i, n) scanf("%d", &a[i]);
        double l = 0, r = 1E10;
        while (r - l > 1E-6) { //二分精度最高到1E-7可以AC, 设置到1E-8样例会超时
            double mid = (l + r) / 2;
            if (judge(mid)) r = mid;
            else l = mid;
        }
        printf("%.8f\n", l);
    }
    return 0;
}

浮点数二分这里触雷了, 本来写的是1E-8, TLE了半天.
经测试发现, 精度设置最高写到1E-7, 望大家避雷

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥Fau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值