[AGC027A]Candy Distribution Again

Description

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

Solution

如果(sum a_i = x)的话,答案就是(N),否则答案一定小于(N)。对于一个熊孩子们的真子集(S),如果(sum_{a_iin 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
", ans);
}

Note

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

原文地址:https://www.cnblogs.com/wyxwyx/p/agc027a.html