• Codeforces Round #835 (Div. 4) F. Quests


    Codeforces Round #835 (Div. 4) F. Quests

    Let’s fix k k k and find the maximum number of coins we can get. Here we can do a greedy solution: at every step, we should always take the most rewarding quest. (Intuitively, it makes sense, since doing more rewarding quests earlier allows us to do them again later.) If no quests are available, we do nothing.

    To implement this, sort the quests in decreasing order, and 0 0 0-index them. On day i i i we should do quest i i i m o d mod mod k k k, provided that this value is less than n n n. This is because after every k k k days, we cycle back to the first quest. Thus we solved the problem for a fixed k k k in O ( d ) O(d) O(d) with O ( n l o g n ) O(nlogn) O(nlogn) precomputation to sort the array.

    Now to solve the problem, we can binary search on the answer, since if some k k k works, then all smaller k k k work. The minimum value of k k k is 0 0 0, and the maximum value is n (for larger k k k, we won’t be able to do the same quest multiple times anyways, so it’s useless to consider them).

    If we find that k k k always goes towards the smaller end of our binary search and k = 0 k=0 k=0 still fails, we output I m p o s s i b l e Impossible Impossible. If we find that k k k always goes towards the larger end of our binary search and k = n k=n k=n still fails, we output I n f i n i t y Infinity Infinity. Otherwise, just output k k k.

    The overall time complexity is O ( n l o g n + d l o g n ) O(nlogn+dlogn) O(nlogn+dlogn).

    Remark. It is not hard to improve the solution to O ( n l o g n ) O(nlogn) O(nlogn). Originally, I proposed the problem this way, but we ended up removing this part of the problem because the implementation of this solution was tricky enough.

    #include
    using namespace std;
    
    typedef long long LL;
    const int N = 200010;
    LL a[N];
    
    int main()
    {
        int T=1;cin>>T;
        while(T--)
        {
            LL n,c,d;cin>>n>>c>>d;
            for(int i=1;i<=n;i++) cin>>a[i];
    
            sort(a+1,a+n+1);
            reverse(a+1,a+n+1);
            for(int i=2;i<=n;i++) a[i]+=a[i-1];
    
            if(a[1]*d<c)
            {
                cout<<"Impossible"<<endl;
                continue ;
            }
    
            if(a[min(n,d)]>=c)
            {
                cout<<"Infinity"<<endl;
                continue ;
            }
    
            auto check=[&](int mid){
                LL sum=0;
                LL dd=d/mid;
                LL yy=d%mid;
                if(mid>=n) sum+=dd*a[n];
                else sum+=dd*a[mid];
    
                if(yy>=n) sum+=a[n];
                else sum+=a[yy];
    
                if(sum<c) return false;
                else return true;
            };
    
            int l=1,r=200000;
            while(l<r)
            {
                int mid=(l+r+1)>>1;
                if(check(mid)) l=mid;
                else r=mid-1;
            }
            cout<<l-1<<endl;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
  • 相关阅读:
    卷起来了?2023这三个项目直接让你原地起飞!
    Web3 solidity编写cancelorder取消订单函数 并梳理讲述逻辑
    解决ssh_exchange_identification:read connection reset by peer 原因
    springboot项目打包部署到阿里云windows服务器全过程记录
    【Java SE】抽象类和接口
    模块和包--python基础
    MagicHub中英混语音识别挑战赛开启报名
    Java基础:Object类、常用API
    不知道吧?未加工的食物可以帮助你减肥
    04 `Linux`的VIM
  • 原文地址:https://blog.csdn.net/qq_52792570/article/details/128000268