鸽巢原理-抽屉原理
鸽巢原理
https://www.bilibili.com/video/BV1H3411L72r
hdu 1205 吃糖果
http://acm.hdu.edu.cn/showproblem.php?pid=1205
解析:
N为最多的一种糖果(A)的数量
S为除最多一种糖果数量之和
把最多数量N看做N个隔板,每个隔板右边可以放一个A糖果,这样N-1个S糖果就可以把A糖果分开
如果S < N - 1,把S个糖果放在隔板之间,S糖果不够N-1,所以有隔板之间没有其他糖果,比如会造成A糖果有相邻的,所以无解。
当S >= N - 1时,肯定有解。可以把N个糖果先插入隔板右侧,然后把S个糖果依次排队插入N个隔板右侧,
由于隔板的数量一定比每一种的糖果数量都多,所以不可能出现有两个同样的糖果放进一个空间的情况。把S个糖果放完,就是一个解

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
ll a[N];
ll n;
int flag;
ll ans;
bool cmp(ll a, ll b)
{
return a > b;
}
int main()
{
int t;
cin >> t;
while (t--)
{
flag = 0;
ans = 0;
scanf ("%I64d", &n);
for (int i = 0; i < n; i++)
{
scanf ("%I64d", &a[i]);
ans += a[i];
}
sort(a, a + n, cmp);
ans -= a[0];
if (ans < a[0] - 1)
{
flag = 1;
}
flag ? cout << "No\n" : cout << "Yes\n";
}
return 0;
}
作者:newcode 更多资源请关注纽扣编程微信公众号

从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习

浙公网安备 33010602011771号