3583 - jetoane

De la Universitas MediaWiki

Enunț

Ionel şi Georgel colecţionează jetoane care se găsesc în revistele Scooby-Doo. Jetoanele au înscrise pe ele diferite valori, numere naturale distincte, un copil neputând avea două sau mai multe jetoane cu aceeaşi valoare. Ei propun următorul joc: având în faţă jetoanele proprii, determină împreună care este jetonul de valoare comună cu cea mai mică valoare înscrisă şi jetonul de valoare comună cu cea mai mare valoare înscrisă. După ce au identificat aceste jetoane, câştigătorul este acela care va avea cele mai multe jetoane după eliminarea acelora cu valori cuprinse între minimul şi maximul comun, inclusiv minimul şi maximul.

Cerința

Determinaţi valorile minimă şi maximă comune, precum şi câştigătorul jocului.

Date de intrare

Fişierul de intrare jetoanein.txt conţine pe prima linie două numere naturale separate printr-un singur spaţiu, m şi n reprezentând numărul de jetoane ale primului copil şi respectiv numărul de jetoane ale celui de-al doilea copil. Pe următoarea linie sunt m+n valori separate prin câte un spaţiu, ce reprezintă jetoanele primului şi apoi jetoanele celui de-al doilea copil.

Date de ieșire

Fişierul de ieșire jetoaneout.txt conţine pe prima linie trei valori întregi Min Max C separate prin câte un spaţiu, unde Min este valoarea minimă comună, Max este valoarea maximă comună, iar C va fi 0, dacă jocul se încheie la egalitate, 1 dacă va câştiga primul copil, sau 2, dacă va câştiga cel de-al doilea copil.

Restricții și precizări

  • 1 ⩽ n, m ⩽ 28.000
  • 1 ⩽ valoarea de pe un jeton ⩽ 50.000
  • Vor exista cel puţin două valori comune

Exemplul 1

Intrare
jetoanein.txt
10 6
1 3 2 4 7 5 8 19 27 9 3 8 80 6 18 19
Ieșire
Datele de intrare corespund restricțiilor impuse
jetoaneout.txt
3 19 1

Explicație

Jetonul comun cel mai mic este cel cu valoarea 3, iar cel mai mare are valoarea 19. Primul rămâne cu 3 jetoane (acestea sunt 1, 2, 27) şi al doilea rămâne cu unul singur (jetonul 80), deci jucătorul 1 este câştigător.

Exemplul 2

Intrare
jetoanein.txt
4 5
6 7 1 90 6 7 68 1 3
Ieșire
Datele de intrare corespund restricțiilor impuse
jetoaneout.txt
1 7 0

Explicație

Jetonul comun cel mai mic este cel cu valoarea 1, iar cel mai mare are valoarea 7. Primul rămâne cu un jeton (acesta este 90) şi al doilea rămâne cu unul singur (jetonul 68), deci egalitate.

Exemplul 3

Intrare
jetoanein.txt
4 28001
6 7 1 90 6 7 68 1 3
Ieșire
Datele de intrare NU corespund restricțiilor impuse

Rezolvare

#3583 - Jetoane

def valideaza_input(m, n, jetoane):
    # Funcție de validare a datelor de intrare conform restricțiilor
    if not (0 < m <= 28000 and 0 < n <= 28000):
        return False
    if len(jetoane) != m + n:
        return False
    return all(0 < val <= 50000 for val in jetoane)


def gaseste_valori_comune(jetoane1, jetoane2):
    # Funcție pentru găsirea valorilor comune dintre cei doi copii
    valori_comune = set(jetoane1) & set(jetoane2)
    return valori_comune


def determina_castigator(jetoane_copil1, jetoane_copil2, valori_comune):
    # Funcție pentru determinarea câștigătorului
    jetoane_ramase_copil1 = [val for val in jetoane_copil1 if val not in valori_comune]
    jetoane_ramase_copil2 = [val for val in jetoane_copil2 if val not in valori_comune]

    if len(jetoane_ramase_copil1) > len(jetoane_ramase_copil2):
        return 1
    elif len(jetoane_ramase_copil1) < len(jetoane_ramase_copil2):
        return 2
    else:
        return 0


def main():
    # Citirea datelor din fișierul de intrare
    with open("jetoanein.txt", "r") as infile:
        m, n = map(int, infile.readline().split())
        jetoane = list(map(int, infile.readline().split()))

    # Validare date de intrare
    if valideaza_input(m, n, jetoane):
        print("Datele de intrare corespund restricțiilor impuse")
    else:
        print("Datele de intrare NU corespund restricțiilor impuse")
        exit(0)

    # Separarea jetoanelor pentru fiecare copil
    jetoane_copil1 = jetoane[:m]
    jetoane_copil2 = jetoane[m:]

    # Găsirea valorilor comune
    valori_comune = gaseste_valori_comune(jetoane_copil1, jetoane_copil2)

    # Determinarea valorilor minimă și maximă comune
    valoare_minima_comuna = min(valori_comune)
    valoare_maxima_comuna = max(valori_comune)

    # Determinarea câștigătorului și scrierea rezultatelor în fișierul de ieșire
    castigator = determina_castigator(jetoane_copil1, jetoane_copil2, valori_comune)

    with open("jetoaneout.txt", "w") as outfile:
        outfile.write(f"{valoare_minima_comuna} {valoare_maxima_comuna} {castigator}\n")


if __name__ == "__main__":
    main()