3694 – Tomi

From Bitnami MediaWiki

Sursa: [1]


Cerinţa[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

  • 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[edit | edit source]

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


Explicație[edit | edit source]

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[edit | edit source]

<syntaxhighlight lang="python" line>

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

</syntaxhighlight>