鸽巢原理-抽屉原理

鸽巢原理
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;
}
posted @ 2022-06-04 07:44  new-code  阅读(59)  评论(0)    收藏  举报