3694 – Tomi

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Sursa: [1]


Cerinţa

Tomi este primarul ales în orașul Bittown. În oras sunt N locuitori și fiecare are un gard format din exact 60 de scânduri, fiecare dintre ele fiind vopsită în alb sau negru. Fiecare gard este codificat de Tomi printr-un număr natural a cărui reprezentare binară reproduce configurația gardului, de la stânga spre dreapta, scândurile negre fiind asimilate cu bitul 1 iar cele albe cu bitul 0. Astfel, ca exemplu, gardul care are doar ultimele două scânduri vopsite în negru va fi codificat de Tomi cu numărul 3. Tomi decide să-și construiască un gard care să fie reprezentativ pentru Bittown, adică să respecte toate regulile următoare: 1. Gardul primarului Tomi trebuie să aibă exact 60 de scânduri; 2. Trebuie să existe cel puțin K locuitori în Bittown care constată că pentru toate scândurile negre din gardul propriu, scândurile situate pe aceeași poziție în gardul primarului Tomi sunt vopsite tot în negru; 3. Numărul reprezentând codul gardului primarului Tomi trebuie să fie minim posibil.

Date de intrare

Fișierul de intrare tomi.in conține pe prima linie doua numere naturale N și K. Pe cea de-a doua linie se află N numere, reprezentând codurile gardurilor locuitorilor din Bittown.

Date de ieșire

Fișierul de ieșire tomi.out va conține un singur număr reprezentand codul gardului construit de primarul Tomi.

Restricţii şi precizări

  • 1 ≤ N ≤ 100.000
  • Fiecare cod este strict mai mic decât 260.
  • Pentru 19 puncte, toți copiii vor avea doar codurile 1, 2 sau 3.
  • Pentru alte 38 puncte, codurile copiilor vor mai mici decât 60.

Exemplu

tomi.in
6 3
1 1 5 8 10 8
tomi.out
5


Explicație

Răspunsul este 5 care are configurația în binar 101. Acesta este reprezentativ pentru codurile primelor trei garduri (1 1 5), pentru că le include configurațiile binare, respectând astfel regula 2.

Rezolvare

def verificare_reguli(cod_primar, coduri_locuitori, K):
    count = 0
    for cod_locuitor in coduri_locuitori:
        if cod_locuitor & cod_primar == cod_locuitor:
            count += 1
    return count >= K

if __name__ == "__main__":
    with open("tomi.in", "r") as fisier_intrare:
        N, K = map(int, fisier_intrare.readline().split())
        coduri_locuitori = list(map(int, fisier_intrare.readline().split()))

    # Verificarea datelor de intrare
    if N < 1 or N > 100000:
        print("Eroare: N trebuie să fie între 1 și 100000.")
        exit(1)
    if K < 1 or K > N:
        print("Eroare: K trebuie să fie între 1 și N.")
        exit(1)
    if len(coduri_locuitori) != N:
        print("Eroare: Numărul de coduri de locuitori nu corespunde valorii N.")
        exit(1)
    for cod_locuitor in coduri_locuitori:
        if cod_locuitor < 0 or cod_locuitor >= 2**60:
            print("Eroare: Codul de gard al unui locuitor este invalid.")
            exit(1)

    cod_minim = float("inf")
    for i in range(1, 2**60):
        if verificare_reguli(i, coduri_locuitori, K):
            cod_minim = i
            break

    with open("tomi.out", "w") as fisier_iesire:
        fisier_iesire.write(str(cod_minim))