zoukankan      html  css  js  c++  java
  • [ICPC2020上海D] Walker

    [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;
        }
    }
    
  • 相关阅读:
    Shell脚本 --- 正则表达式和文本处理工具
    python的eval、exec函数
    内置函数 Built-in Functions
    关于Python中的lambda
    Python中*args和**kwargs的区别
    Python基础-10-文件操作
    Python基础-09-内置函数
    Python基础-08-函数
    Python基础-07-集合
    Python基础-06-字典
  • 原文地址:https://www.cnblogs.com/mollnn/p/14146558.html
Copyright © 2011-2022 走看看