Settlement of Guinea Pigs (Codeforces 1802B)
Tags: Math, implementation

Dasha loves guinea pigs very much. In this regard, she decided to settle as many guinea pigs at home as possible and developed a plan for the next $$$n$$$ days. Every day, she will either buy a new guinea pig or call a doctor to examine all her pets.Unfortunately, the store where she was going to buy guinea pigs does not understand them. Therefore, it cannot determine their gender. Dasha can't do it either. The only one who can help is a doctor. To keep guinea pigs, aviaries are needed. Dasha plans to buy them in the same store. Unfortunately, only one species is sold there — a double aviary. No more than two guinea pigs can live in it.Since Dasha does not want to cause moral injury to her pets — she will not settle two guinea pigs of different genders in one aviary.Help Dasha calculate how many aviaries in the worst case you need to buy so that you can be sure that at no moment of time do two guinea pigs of different genders live in the same aviary.As part of this task, we believe that guinea pigs have only two genders — male and female.

Input: The first line of input data contains one number $$$t$$$ ($$$1 \leqslant t \leqslant 10^5$$$) — the number of input data sets.The first line of each input data set contains one number $$$n$$$ ($$$1 \leqslant n \leqslant 10^5$$$) — the number of days Dasha has a plan for.The next line contains $$$n$$$ numbers $$$b_1, b_2, b_3, \ldots, b_n$$$ ($$$1 \leqslant b_i \leqslant 2$$$) — Dasha's plan. If $$$b_i = 1$$$, then on the $$$i$$$th day, Dasha will buy a new guinea pig. If $$$b_i = 2$$$, then on the $$$i$$$th day, a doctor will come to Dasha and help determine the sex of all guinea pigs that Dasha already has.It is guaranteed that the sum of $$$n$$$ for all input data sets does not exceed $$$10^5$$$.

Output: For each set of input data, output one number — the minimum number of aviaries Dasha needs to buy so that no matter what the genders of the pigs turn out to be, we can settle them so that at no point in time do two guinea pigs of different genders live together.

Note: In the first set of input data, Dasha needs to put each guinea pig in a separate enclosure, since she does not know their gender.In the second set of input data, Dasha will buy $$$0$$$ guinea pigs, which means she will need $$$0$$$ aviaries.In the third set of input data, you even need $$$3$$$ aviaries to put each guinea pig in a separate aviary before the doctor arrives at the $$$4$$$th day. When she finds out their gender, at least two guinea pigs will be of the same gender and they can be placed in one aviary, and the third in another aviary. Thus, she will have one free aviary in which she can settle a new guinea pig. So answer is $$$3$$$.In the fourth set of input data, we show that $$$4$$$ is the optimal answer. To begin with, we note that the first four guinea pigs can be placed one at a time in an aviary. Then a doctor will come and determine their gender. Among these four guinea pigs there will be at least one pair of the same gender, because: either male guinea pigs are at least $$$2$$$, or they are not more than $$$1$$$, which means that the female is at least $$$3$$$. Now we can put this couple in one aviary, and the other two in separate ones. We will have one more empty aviary where we can put a new pig.Now let's show that the answer is at least $$$4$$$. Let's say that among the first $$$4$$$ guinea pigs, $$$3$$$ are female and $$$1$$$ is male. We need at least $$$3$$$ aviaries to settle them. Then, when we buy a new guinea pig, we will need another aviary in which we will put it, since we do not know its gender.

Sample Inputs:
6
3
1 1 1
3
2 2 2
5
1 1 1 2 1
10
1 2 1 2 1 2 1 2 1 2
20
1 2 1 1 1 1 1 2 1 2 1 2 2 1 1 1 1 1 1 1
20
2 1 1 2 1 1 2 1 2 2 1 1 1 2 2 1 1 1 1 2

Sample Outputs:
3
0
3
4
12
9

Solution (Python):
for i in [*open(0)][2::2]:
    i = [*map(int, i.split())]
    z = 0
    ans = 0
    mz = 0
    for j in i:
        if j == 1:
            z += 1
            mz = max(mz, z)
        elif z - ans > 2:
            x = (z + 1 - ans) % 2 + 1
            f = ans
            ans += (z - x - f) // 2
            z -= (z - x - f) // 2
    print(mz)

Solution (Python):
import sys
from os import path

def input():
    return sys.stdin.readline().strip()

def solve(n, array):
    maximum = 0
    count = 0
    check = 0
    left = 0
    for i in range(n):
        if array[i] == 1:
            if left == 0:
                count += 1
            else:
                left -= 1
                count += 1
        else:
            maximum = max(count - check, maximum)
            left = count - count // 2 - 1 if count > 0 else 0
            check = left
    maximum = max(count - check, maximum)
    print(maximum)

def main():
    testcases = int(input())
    for _ in range(testcases):
        n = int(input())
        array = list(map(int, input().split(' ')))
        solve(n, array)
if __name__ == '__main__':
    if path.exists('input'):
        sys.stdin = open('input', 'r')
        sys.stdout = open('output', 'w')
    main()

Solution (Python):
for i in [*open(0)][2::2]:
    i = [*map(int, i.split())]
    z = 0
    ans = 0
    mz = 0
    for j in i:
        if j == 1:
            z += 1
            mz = max(mz, z)
        elif z - ans > 2:
            x = (z + 1 - ans) % 2 + 1
            f = ans
            ans += (z - x - f) // 2
            z -= (z - x - f) // 2
    print(mz)