思路:
从全集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")