• 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
  • 相关阅读:
    unity il2cpp打包安卓打包崩溃原因Unity2020.3 il2cpp.so丢失
    KeenTune的算法之心——KeenOpt 调优算法框架 | 龙蜥技术
    基于Dockerfile创建镜像实战
    Python教程
    企业数据资产管理的参考框架和方法
    [图论]哈尔滨工业大学(哈工大 HIT)学习笔记32-39
    vant 组件库的基本使用
    排序算法(python)
    EtherCAT从站EEPROM分类附加信息详解:FMMU(现场总线内存管理单元)
    测试面试回顾(1)
  • 原文地址:https://blog.csdn.net/qq_52792570/article/details/128000268