思路:
从全集S中随机选取p个元素后,形成了两个集合。
S1:选取的已知的p个元素
S2:剩下未知的元素
如何根据S1和S2做出必胜的判断——即一定不会抽到两个相同元素?
1、要求S1的元素包含至少两种不同的类或者某个类的全部元素。根据鸽巢原理可得p1=max(占比最大的类的元素的个数)
2、要求S2包含每个类的元素恰为一个,共有k个元素。这里要求p2=|S|-k
选取以上的两个数的最小值:min(p1,p2)即可。
#include <iostream>
using namespace std;
int check() {
int n;
cin >> n;
long tmp;
long nmax = 0;
long size = 0;
if (n == 1) {
cin >> tmp;
return -1;
}
for (int i = 0; i < n; i++) {
cin >> tmp;
size += tmp;
nmax = max(nmax, tmp);
}
if (nmax == 1) return 0;//这里可以注释掉
return min(nmax, size - n);
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cout << check() << '\n';
}
}
// 64 位输出请用 printf("%lld")



京公网安备 11010502036488号