zoukankan      html  css  js  c++  java
  • Codeforces 725E Too Much Money (看题解)

    Too Much Money

    最关键的一点就是这个贪心可以在sqrt(n)级别算出答案。

    因为最多有sqrt(n)个不同的数值加入。

    我们可以发现最优肯定加入一个。

    然后维护一个当前可以取的最大值, 枚举加入的数来贪心。

    #include<bits/stdc++.h>
    #define LL long long
    #define fi first
    #define se second
    #define mk make_pair
    #define PLL pair<LL, LL>
    #define PLI pair<LL, int>
    #define PII pair<int, int>
    #define SZ(x) ((int)x.size())
    #define ull unsigned long long
    
    using namespace std;
    
    const int N = 2e5 + 7;
    const int inf = 0x3f3f3f3f;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const int mod = 1000000007;
    const double eps = 1e-6;
    const double PI = acos(-1);
    
    int tar, n, tot, a[N], hs[N], cnt[N], mx[N], now[N];
    vector<int> vc;
    
    bool check(int add) {
        vc.clear();
        int c = tar;
        int p = mx[c];
        while(c) {
            if(add > c) add = 0;
            while(!now[p] && p) p--;
            p = min(p, mx[c]);
            if(!p && !add) break;
            if(p && hs[p] >= add) {
                vc.push_back(p);
                int v = hs[p], num = min(now[p], c / v);
                now[p] -= num;
                c -= num * v;
            } else {
                c -= add;
                add = 0;
            }
        }
        for(auto& x : vc) now[x] = cnt[x];
        return c;
    }
    
    int main() {
        scanf("%d%d", &tar, &n);
        for(int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
            hs[++tot] = a[i];
        }
        sort(hs + 1, hs + tot + 1);
        tot = unique(hs + 1, hs + tot + 1) - hs - 1;
        for(int i = 1; i <= n; i++) cnt[lower_bound(hs + 1, hs + tot + 1, a[i]) - hs]++;
        for(int i = 1; i <= tot; i++) now[i] = cnt[i];
        for(int i = 1; i <= tar; i++) mx[i] = upper_bound(hs + 1, hs + tot + 1, i) - hs - 1;
        for(int i = 1; i <= tar; i++) {
            if(check(i)) {
                printf("%d
    ", i);
                return 0;
            }
        }
        puts("Greed is good");
        return 0;
    }
    
    /*
    */
  • 相关阅读:
    oracle之修改/忘记用户密码
    linux 使用错误总结
    oracle数据库之用户管理
    linux命令使用总结
    linux各种压缩包的压缩和解压方法
    logback将日志写入不同文件夹里
    nginx下配置多个web服务
    OKHttp3学习
    linux 发送 post 请求
    maven 项目下 Maven Dependencies 下列表为空
  • 原文地址:https://www.cnblogs.com/CJLHY/p/10559955.html
Copyright © 2011-2022 走看看