Trust Nobody (Codeforces 1826A)
Tags: Greedy, sortings

There is a group of $$$n$$$ people. Some of them might be liars, who always tell lies. Other people always tell the truth. The $$$i$$$-th person says "There are at least $$$l_i$$$ liars amongst us". Determine if what people are saying is contradictory, or if it is possible. If it is possible, output the number of liars in the group. If there are multiple possible answers, output any one of them.

Input: The first line contains a single integer $$$t$$$ ($$$1 \leq t \leq 1000$$$) — the number of test cases.The first line of each test case contains a single integer $$$n$$$ ($$$1 \leq n \leq 100$$$).The second line of each test case contains $$$n$$$ integers $$$l_i$$$ ($$$0 \leq l_i \leq n$$$) — the number said by the $$$i$$$-th person.It's guaranteed that the sum of all $$$n$$$ does not exceed $$$10^4$$$.

Output: For each test case output a single integer. If what people are saying is contradictory, output $$$-1$$$. Otherwise, output the number of liars in the group. If there are multiple possible answers, output any one of them.

Note: In the first example, the only possible answer is that the second person is a liar, so the answer is $$$1$$$ liar.In the second example, it can be proven that we can't choose the liars so that all the requirements are satisfied.In the third example, everybody tells the truth, so the answer is $$$0$$$ liars.

Sample Inputs:
7
2
1 2
2
2 2
2
0 0
1
1
1
0
5
5 5 3 3 5
6
5 3 6 6 3 5

Sample Outputs:
1
-1
0
-1
0
3
4

Solution (Python):
for s in [*open(0)][2::2]:
    n = len((a := s.split()))
    b = [0] * (n + 1)
    c = -1
    s = i = 0
    for x in a:
        b[int(x)] += 1
    for x in b:
        s += x
        c = (c, i)[s == n - i]
        i += 1
    print(c)

Solution (Python):
from collections import *
from itertools import *
from bisect import *
from heapq import *
from math import ceil, prod, gcd
mod = 10 ** 9 + 7
d = ((1, 0), (0, 1), (0, -1), (-1, 0))
alpha = 'abcdefghijklmnopqrstuvwxyz'

def helper():
    count = 0
    prev = 1
    for key in keys:
        if key <= count and count < prev:
            return count
        count += c[key]
        prev = key
    return -1
for _ in range(int(input())):
    n = int(input())
    arr = list(map(int, input().split()))
    c = Counter(arr)
    keys = sorted(c.keys(), reverse=True)
    print(helper())

Solution (Python):
for s in open(0).readlines()[2::2]:
    a = s.split()
    n = len(a)
    b = [0] * 101
    r = i = -1
    for x in a:
        b[int(x)] += 1
    for x in b:
        i += 1
        n -= x
        r = (r, i)[n == i]
    print(r)