当前位置: 代码迷 >> 综合 >> HOJ 1205 吃糖果(抽屉原理)
  详细解决方案

HOJ 1205 吃糖果(抽屉原理)

热度:9   发布时间:2023-12-13 19:21:25.0

抽屉原理
本题要点:
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 */