[ICPC2020上海D] Walker - 贪心

Description

给定一个长度为 \(n\) 的数轴,有两个人分别位于 \(p_1,p_2\),走路速度为 \(v_1,v_2\),求覆盖完整个数轴的最短时间。

Solution

考虑二分时间 \(t\),显然两个人走路过程不对穿一定不会更劣,换言之我们可以把数轴划分为两部分分别分给两个人。

于是在判定时,我们要做的,是计算 \(f(p_1,v_1,t) + f(n-p_2,v_2,t) \ge n\) 是否成立。

现在考虑 \(f(p,v,t)\) 的计算过程,其中 \(p\) 代表的是到端点的距离。

显然有两种方案,一种是走到中间点再回来,一种是走到端点再回来,如果能满足 \(p \ge vt\),则在二者中取个 \(\max\) 作为答案即可。

#include <bits/stdc++.h>
using namespace std;

#define int long long

double f(double p, double v, double t)
{
    if (v * t < p)
        return 0;
    return max(p, max(v * t - p, p + (v * t - p) / 2));
}

bool check(double p1, double v1, double p2, double v2, double t, double n)
{
    return f(p1, v1, t) + f(n - p2, v2, t) > n || f(n - p1, v1, t) + f(p2, v2, t) > n;
}

signed main()
{
    ios::sync_with_stdio(false);

    int t;
    cin >> t;

    while (t--)
    {
        double n, p1, v1, p2, v2;
        cin >> n >> p1 >> v1 >> p2 >> v2;
        double l = 0, r = 1e18;
        for (int _ = 0; _ <= 100; _++)
        {
            double mid = (l + r) / 2;
            if (check(p1, v1, p2, v2, mid, n))
                r = mid;
            else
                l = mid;
        }
        cout << setiosflags(ios::fixed) << setprecision(12) << l << endl;
    }
}

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-03
  • 2022-03-10
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-08-26
  • 2022-12-23
  • 2022-12-23
  • 2021-05-24
  • 2022-12-23
  • 2021-06-09
相关资源
相似解决方案