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;
    }
    
    /*
    */
  • 相关阅读:
    golang strings.Split函数
    Launch agent by connecting it to the master
    使用srvany.exe把程序安装成windows服务的方法
    区别对待 .gz 文件 和 .tar.gz 文件
    go 使用 sort 对切片进行排序
    Go数组遍历与排序
    Container killed on request. Exit code is 143
    ERROR tool.ImportTool
    报错笔记:sqoop 执行import命令报错
    连不上网
  • 原文地址:https://www.cnblogs.com/CJLHY/p/10559955.html
Copyright © 2011-2022 走看看