题解 | 预知

预知

https://www.nowcoder.com/practice/d9dd8fb2f4ca4385b3728b7bf9c9d0a4

思路:

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

全部评论

相关推荐

站队站对牛:满分干 应届生积累经验
一人推荐一个机械人值得去...
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务