抽屉原理
本题要点:
1、先找出数量最多的一种糖果,假设有N个, 其他所有的糖果有 S个。
把N种糖果看做是N块挡板,其他的S个 糖果放在挡板之间。
2、如果 S < N - 1, 说明至少有两个挡板之间没有放 糖果,而这两个挡板是同一种糖果,所以无解
3、如果 S >= N - 1, 肯定有解。
把S个糖果排队,其中同种类的糖果是连续的。每次取N个糖果,按顺序一个一个放到N个空间,
由于隔板的数量比每一种的糖果数量都多,因此不可能有两个同类的糖果放到同一个空间。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int MaxN = 1000010;
long long a[MaxN];
int T, n;
long long max_num, s;int main()
{
scanf("%d", &T);while(T--){
s = 0;max_num = -1;scanf("%d", &n);for(int i = 0; i < n; ++i){
scanf("%lld", &a[i]);s += a[i];max_num = max_num < a[i] ? a[i] : max_num;}s = s - max_num;if(s >= max_num - 1){
printf("Yes\n");}else{
printf("No\n");}}return 0;
}/* 2 3 4 1 1 5 5 4 3 2 1 *//* No Yes */