3694 – Tomi

De la Universitas MediaWiki

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))