首页 > 试题广场 >

预知

[编程题]预知
  • 热度指数:4253 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}牌桌上有 n 种不同的卡牌,第 i 种卡牌有 a_i 张。初始时,所有的卡牌均背面朝上,但不知道其确切的种类。你有两次翻牌机会,翻牌后,如果两张卡牌种类一致,那你就输了。两次翻牌同时进行(不存在根据翻开的第一张牌更改策略的情况)。

\hspace{15pt}你不喜欢运气游戏,所以你可以通过手段随机预知 k 张卡牌后再进行游玩。

\hspace{15pt}然而,预知很累!你想要知道,你至少需要预知多少张卡牌,才能保证你不会输。

输入描述:
\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1\leqq T\leqq 2 \times 10^5\right) 代表数据组数,每组测试数据描述如下:

\hspace{15pt}第一行输入一个整数 n\left(1\leqq n\leqq 2 \times 10^5\right) 代表卡牌种类数。
\hspace{15pt}第二行输入 n 个整数 a_1, a_2, \dots, a_n\left(1\leqq a_i\leqq 10^9\right) 代表每种卡牌数量。

\hspace{15pt}除此之外,保证每一组测试数据的卡牌总数之和不小于 2 ;单个测试文件的 n 之和不超过 2 \times 10^5


输出描述:
\hspace{15pt}对于每一组测试数据,如果没有必胜策略,直接输出 -1 ;否则,在单独的一行上输出一个整数,代表你至少需要预知多少张卡牌,才能保证你不会输。
示例1

输入

3
2
1 1
1
10
2
2 3

输出

0
-1
3

说明

\hspace{15pt}对于第一组测试数据,只有两张卡牌,且各不相同,直接翻开即可。

\hspace{15pt}对于第二组测试数据,由于卡牌种类唯一,不管怎么翻都会输。
T = int(input())
for i in range(T):
    n = int(input())
    p = list(map(int,input().split()))
    if n==1:
        print(-1)
    else:
        if sum(p)==max(p)+n-1:#“除最大堆外,所有其他卡牌数量均为 1”
            print(max(p)-1)#随机预知k张;①预知的选一张,剩余的选一张。②预知的里面选两种
        else:
            print(max(p))#①预知的选一张,剩余的选一张。②预知的里面选两种,k张牌中必然包含两种(对应②),或者只为数量最多的牌(对应①)。

发表于 2025-06-08 21:57:08 回复(0)
只需要知道除了最大数外其余数是否均为1即可,是则输出max-1,不是则输出max
T = int(input())
for i in range(T):
    n = int(input())
    a = list(map(int,input().split()))
    if n==1:
        print(-1)
    else:
        if sum(a)==max(a)+n-1:
            print(max(a)-1)
        else:
            print(max(a))
发表于 2025-03-21 11:30:41 回复(0)