[AGC027A]Candy Distribution Again

Description

AGC027A
你有一些糖果,你要把这些糖果一个不剩分给一些熊孩子,但是这帮熊孩子只要特定数目的糖果,否则就会不开心,求最多的开心人数。

Solution

如果\(\sum a_i = x\)的话,答案就是\(N\),否则答案一定小于\(N\)。对于一个熊孩子们的真子集\(S\),如果\(\sum_{a_i\in S} a_i \le x\),那么一定可以满足这些孩子,然后把剩下的糖果任意分配到剩下的孩子手中即可。这样我们只需要找到最大的\(S\),排序后贪心即可。但是不要忘了如果\(|S| = N\),要输出\(N-1\)

Code

#include <cstdio>
#include <algorithm>
 
const int N = 110;
 
int a[N], n, m;
 
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    std::sort(a+1, a+n+1);
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        if (m >= a[i]) {
            m -= a[i];
            ans++;
        } else {
            break;
        }
    }
    if (m != 0 && ans == n) ans--; // 这里我一开始写的是 if (m != 0 && ans > 0) ans--;
    printf("%d\n", ans);
}

Note

这个题我竟然做了两个小时才做出来,一开始想的是各种奇怪的贪心或者是DP等乱七八糟的算法,实际上只是没有想出来如果有糖剩下,并不一定答案就是错的。看来还是要多刷一些思维题,不要老是看题解和打板子。

猜你喜欢

转载自www.cnblogs.com/wyxwyx/p/agc027a.html