2896 - binar1

From Bitnami MediaWiki
Revision as of 02:13, 5 January 2024 by Miawinator (talk | contribs) (Pagină nouă: Pentru a converti un număr din zecimal în binar îl vom împărți la <code>2</code> în mod repetat, până ce obținem câtul zero. Apoi vom colecta resturile obținute de la ultimul către primul. Aceste resturi sunt cifrele din reprezentarea binară a numărului dat, de la stânga la dreapta. De exemplu, <code>13(10)</code> <code>= 1101(2)</code>. = Cerința = Scrieți un program care, pentru un șir dat de n numere naturale, rezolvă următoarele cerințe: 1) Determi...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Pentru a converti un număr din zecimal în binar îl vom împărți la 2 în mod repetat, până ce obținem câtul zero. Apoi vom colecta resturile obținute de la ultimul către primul. Aceste resturi sunt cifrele din reprezentarea binară a numărului dat, de la stânga la dreapta. De exemplu, 13(10) = 1101(2).

Cerința[edit | edit source]

Scrieți un program care, pentru un șir dat de n numere naturale, rezolvă următoarele cerințe:

1) Determină cel mai mare dintre cele n numere date ce are număr maxim de valori de 1 în reprezentarea binară.

2) Determină cea mai lungă secvență de numere care au număr egal de valori de 1 în reprezentarea binară. Dacă sunt mai multe astfel de secvențe de lungime maximă, se va alege cea mai din stânga. O secvență este un subșir de numere care apar pe poziții consecutive în șirul inițial.

Date de intrare[edit | edit source]

Fișierul de intrare input.txt conţine pe prima linie numărul C reprezentând cerința (1 sau 2), pe a doua linie numărul natural n, iar pe a treia linie n numere naturale separate prin câte un spațiu.

Date de ieșire[edit | edit source]

Dacă C = 1, atunci pe prima linie a fișierului de ieșire output.txt se va scrie numărul ce reprezintă răspunsul la cerința 1. Dacă C = 2, atunci pe prima linie a fișierului de ieșire output.txt se vor scrie, separate printr-un spațiu, lungimea maximă a secvenței determinate și poziția primului termen din secvență (se consideră că primul număr din cele n numere date se găsește pe poziția 1).

Restricții și precizări[edit | edit source]

  • 1 ≤ n ≤ 1.000.000

Exemplul 1[edit | edit source]

input.txt:

1

7

16 12 3 5 14 13 11

output.txt:

14

Explicație:

16(10) = 10000(2); 12(10) = 1100(2); 3(10) = 11(2); 5(10) = 101(2); 14(10) = 1110(2); 13(10) = 1101(2); 11(10) = 1011(2);

Cel mai mare număr de valori de 1 dintr-o reprezentare binară este 3; cel mai mare număr ce are 3 de 1 în reprezentarea binară este 14.

Exemplul 2[edit | edit source]

input.txt:

2

7

16 12 3 5 14 13 11

output.txt:

3 2

Explicație:

Sunt două secvențe de lungime maximă de numere care au număr egal de valori de 1 în reprezentarea binară: 12 3 5 și 14 13 11. O vom alege pe cea mai din stânga, care are lungimea 3 și începe la poziția 2.

Exemplul 3[edit | edit source]

input.txt:

2

99999999999999

16 12 3 5 14 13 11

Output:

Input-ul nu convine conditiilor

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> NM = 1000001

def verificare(n):

   if not(1<=n<=1000000):
       print("Input-ul nu convine conditiilor")
       exit()

def count_set_bits(num):

   count = 0
   while num:
       count += num & 1
       num >>= 1
   return count

with open("input.txt", "r") as fin, open("output.txt", "w") as fout:

   c = int(fin.readline())
   n = int(fin.readline())
   verificare(n)
   l=list(map(int, fin.readline().split()))
   a = [0] * (n + 1)
   
   xmax = 0
   nr1max = 0
   
   for i in range(1, n + 1):
       x = l[i-1]
       aux = x
       nr1 = 0
       
       while aux > 0:
           nr1 += 1
           aux = aux & (aux - 1)
       
       if nr1 > nr1max or (nr1 == nr1max and x > xmax):
           nr1max = nr1
           xmax = x
       
       a[i] = nr1
   
   if c == 1:
       # cerinta 1
       fout.write(str(xmax))
   else:
       # cerinta 2
       lgm = 0
       lgc = 1
       pc = 1
       
       for i in range(2, n + 1):
           if a[i] == a[i - 1]:
               lgc += 1
           else:
               if lgc > lgm:
                   lgm = lgc
                   pm = pc
               lgc = 1
               pc = i
       
       if lgc > lgm:
           lgm = lgc
           pm = pc
       
       fout.write(f"{lgm} {pm}")

</syntaxhighlight>