[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等乱七八糟的算法,实际上只是没有想出来如果有糖剩下,并不一定答案就是错的。看来还是要多刷一些思维题,不要老是看题解和打板子。