2279 - Concurs Perf

De la Universitas MediaWiki
Versiunea din 22 aprilie 2023 10:21, autor: Paul Ungur (discuție | contribuții) (Pagină nouă: ==Cerința== Chef vrea să organizeze un concurs. Previziunea nivelurilor de dificultate a problemelor poate fi o sarcină descurajantă. Chef vrea să echilibreze nivelurile de dificultate ale problemelor. Să presupunem că un concurs a avut <span style=“color: red”> P</span> participanți în total. <span style=“color: red”> O</span> problemă care a fost rezolvată de cel puțin jumătate dintre participanți (adică <span style=“color: red”> P/2</span>) este...)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)

Cerința

Chef vrea să organizeze un concurs. Previziunea nivelurilor de dificultate a problemelor poate fi o sarcină descurajantă. Chef vrea să echilibreze nivelurile de dificultate ale problemelor.

Să presupunem că un concurs a avut P participanți în total. O problemă care a fost rezolvată de cel puțin jumătate dintre participanți (adică P/2) este considerată ușoară. O problemă rezolvată de participanții de cel mult P/10 este considerată dificilă.


Chef vrea echilibru. Potrivit lui, un concurs echilibrat trebuie să aibă exact 1 problemă ușoară și exact 2 probleme grele. Vi se oferă descrierea problemelor N și numărul de participanți care rezolvă aceste probleme. Puteți spune dacă concursul a fost echilibrat sau nu?

Date de intrare

Primul rând conține un număr întreg T care indică numărul de cazuri de testare. Prima linie a fiecărui caz de testat conține două numere întregi N și P indicând numărul de probleme, respectiv numărul de participanți. Cea de-a doua linie conține N numere întregi, separate prin spațiu, al căror număr indică numărul de participanți care rezolvă problema cu numărul de ordine i.

Date de ieșire

Pentru fiecare caz, afișati da, dacă concursul este echilibrat, sau nu.

Restricții și precizări

1 ≤ T, N ≤ 500 1 ≤ P ≤ 10^8^ 1 ≤ numărul de participanți care rezolvă o problemă ≤ P

Exemplu:

Intrare 6 3 100 10 1 100 3 100 11 1 100 3 100 10 1 10 3 100 10 1 50 4 100 50 50 50 50 4 100 1 1 1 1

Ieșire da nu nu da nu nu

Rezolvare

def validate(t, n, p, problems):
    if t <= 0 or n <= 0 or p <= 0:
        return False
    if len(problems) != n:
        return False
    if not all(1 <= x <= p for x in problems):
        return False
    return True

def read_input():
    t = int(input())
    test_cases = []
    for i in range(t):
        n, p = map(int, input().split())
        problems = list(map(int, input().split()))
        if not validate(t, n, p, problems):
            return None
        test_cases.append((n, p, problems))
    return test_cases

def is_balanced(n, p, problems):
    easy = 0
    hard = 0
    for i in range(n):
        if problems[i] > p // 2:
            easy += 1
        elif problems[i] <= p // 10:
            hard += 1
    return easy == 1 and hard == 2

def main():
    test_cases = read_input()
    if test_cases is None:
        print("Invalid input")
        return
    for case in test_cases:
        n, p, problems = case
        if is_balanced(n, p, problems):
            print("da")
        else:
            print("nu")

if __name__ == '__main__':
    main()

Explicatie

În funcția validate, verificăm dacă datele de intrare sunt valide, adică dacă numerele sunt în intervalul specificat și dacă lista problemelor are dimensiunea corectă.

În funcția read_input, citim datele de intrare pentru fiecare caz de testare și le validăm folosind funcția validate.

În funcția is_balanced, verificăm dacă un anumit caz de testare respectă condițiile problemei, adică dacă există o singură problemă ușoară și două probleme grele.

În funcția main, citim datele de intrare pentru fiecare caz de testare și le procesăm folosind funcția is_balanced.