Going to the Cinema (Codeforces 1781B)
Tags: Greedy, sortings

A company of $$$n$$$ people is planning a visit to the cinema. Every person can either go to the cinema or not. That depends on how many other people will go. Specifically, every person $$$i$$$ said: "I want to go to the cinema if and only if at least $$$a_i$$$ other people will go, not counting myself". That means that person $$$i$$$ will become sad if:   they go to the cinema, and strictly less than $$$a_i$$$ other people go; or  they don't go to the cinema, and at least $$$a_i$$$ other people go. In how many ways can a set of people going to the cinema be chosen so that nobody becomes sad?

Input: Each test contains multiple test cases. The first line contains the number of test cases $$$t$$$ ($$$1 \le t \le 10^4$$$). The description of the test cases follows.Each test case consists of two lines. The first line contains a single integer $$$n$$$ ($$$2 \le n \le 2 \cdot 10^5$$$) — the number of people in the company.The second line contains $$$n$$$ integers $$$a_1, a_2, \ldots, a_n$$$ ($$$0 \le a_i \le n - 1$$$) — integers from peoples' claims.It is guaranteed that the sum of $$$n$$$ over all test cases does not exceed $$$2 \cdot 10^5$$$.

Output: For each test case, print a single integer — the number of different ways to choose a set of people going to the cinema so that nobody becomes sad.

Note: In the first test case, both people want to go to the cinema if and only if the other person goes. There are two valid options: either both people go, or neither of them goes. However, if just one of them goes, both will be sad.In the second test case, everyone has to go to the cinema. In any other case, someone will be sad.In the third test case, there are three valid options: person number $$$2$$$ goes to the cinema; or persons with indices $$$2, 3, 4, 7$$$ go; or all eight people go.

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

Sample Outputs:
2
1
3
2

Solution (Python):
def main():
    t = int(input())
    for i in range(t):
        n = int(input())
        lst = list(map(int, input().split()))
        lst.sort()
        res = 1
        for j in range(n - 2, -1, -1):
            if lst[j] <= j and j + 1 < lst[j + 1]:
                res += 1
        if lst[0] != 0:
            res += 1
        print(res)
if __name__ == '__main__':
    main()

Solution (Python):
for i in range(int(input())):
    N = int(input())
    array = list(map(int, input().split()))
    array.sort()
    result = 1
    for i in range(N - 1):
        if array[i] <= i and array[i + 1] > i + 1:
            result += 1
    if array[0] != 0:
        result += 1
    print(result)

Solution (Python):
for _ in range(int(input())):
    nr_people = int(input())
    preference = list(map(int, input().split(' ')))
    preference.sort()
    n = 0
    for nr_people_going in range(nr_people + 1):
        if nr_people_going == 0:
            if preference[0] != 0:
                n += 1
        elif nr_people_going == nr_people:
            if preference[nr_people_going - 1] <= nr_people_going:
                n += 1
        elif preference[nr_people_going] > nr_people_going and preference[nr_people_going - 1] <= nr_people_going - 1:
            n += 1
    print(n)