• [CF1461E] Water Level


    [CF1461E] Water Level

    Description

    饮水机中本来有 (k) 升水,John希望在 (t) 天内饮水机的水量在 ([l,r]) 之间,John知道每一天饮水机会被用掉正好 (x) 升水,而John可以在一天的开始选择加正好 (y) 升水(一天只能加一次)或不加水.给出 (k,l,r,t,x,y).求能否在 (t) 天内把水量控制在 ([l,r]).能输出 Yes ,否则输出 No. (1leq lleq kleq rleq 10^{18},1leq tleq10^{18},1leq xleq10^6,1leq yleq10^{18}.)

    Solution

    (y=x,y<x,y>x) 三种情况考虑

    这里主要说 (y>x)

    我们尽可能让它减到不能再减,然后加一次

    循环的结束条件为 t=0 或者发现水量序列出现了循环节

    这是大体的思路,诸多的细节难以详述,见代码

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int __int128
    
    int t, l, r, k, x, y;
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        long long t1, t2, t3, t4, t5, t6;
        cin >> t1 >> t2 >> t3 >> t4 >> t5 >> t6;
        k = t1;
        l = t2;
        r = t3;
        t = t4;
        x = t5;
        y = t6;
    
        if (x == y)
        {
            if (k + y <= r || k - x >= l)
                cout << "Yes" << endl;
            else
                cout << "No" << endl;
        }
        else if (y < x)
        {
            if (k + y <= r)
                k += y;
            int t0 = (k - l - y) / (x - y);
            cout << (t0 >= t ? "Yes" : "No") << endl;
        }
        else
        {
            if (k + y <= r)
                k += y;
            set<int> s;
            s.insert(k);
            while (t > 0)
            {
                int d = min((k - l) / x, t);
                k -= d * x;
                t -= d;
                if (d == 0)
                {
                    cout << "No" << endl;
                    return 0;
                }
                if (s.find(k) != s.end())
                {
                    cout << "Yes" << endl;
                    return 0;
                }
                s.insert(k);
                if (t == 0)
                    break;
                k += y;
                if (k > r)
                {
                    cout << "No" << endl;
                    return 0;
                }
                if (s.find(k) != s.end())
                {
                    cout << "Yes" << endl;
                    return 0;
                }
                s.insert(k);
                if (d == 0)
                {
                    cout << "No" << endl;
                    return 0;
                }
            }
            cout << "Yes" << endl;
        }
    }
    
  • 相关阅读:
    integer和double的比较.
    查看mysql版本的四种方法
    codefoces 1397D Stoned Game
    最小生成树集合合并
    codefoces 1400B RPG Protagonist
    codefoces 1400B RPG Protagonist
    牛客挑战赛42 小睿睿的伤害
    病毒扩散 排列组合
    Dus on tree 月出皎兮,佼人僚兮。
    msc的宠物 二分+树形DP
  • 原文地址:https://www.cnblogs.com/mollnn/p/14520671.html
Copyright © 2020-2023  润新知