2525 - Cioc

From Bitnami MediaWiki
Revision as of 01:17, 3 January 2024 by Zmicala Narcis (talk | contribs) (Pagină nouă: == Cioc == '''Cioc''', un elev abia aterizat în clasa a IX-a, primește de la doamna profesor de informatică un șir de '''n''' numere naturale pe care trebuie să îl prelucreze. Astfel, băiatul trebuie să scrie după fiecare dintre cele '''k''' cele mai mici elemente dublul lor. Dacă cel mai mare dintre aceste numere se repetă și deja se depășesc cele '''k''' elemente prevăzute, doamna profesor îi dă libertatea băiatului de a modifica valoarea lui '''k''' astfe...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cioc[edit | edit source]

Cioc, un elev abia aterizat în clasa a IX-a, primește de la doamna profesor de informatică un șir de n numere naturale pe care trebuie să îl prelucreze. Astfel, băiatul trebuie să scrie după fiecare dintre cele k cele mai mici elemente dublul lor. Dacă cel mai mare dintre aceste numere se repetă și deja se depășesc cele k elemente prevăzute, doamna profesor îi dă libertatea băiatului de a modifica valoarea lui k astfel încât să cuprindă și aceste valori. De exemplu, dacă n = 7, v[] = {1, 4, 6, 2, 3, 4, 5} și k = 4, atunci, în urma prelucrării, șirul v devine {1, 2, 4, 8, 6, 2, 4, 3, 6, 4, 8, 5}, și deci kfinal=5.

Cerința[edit | edit source]

Cunoscându-se n, șirul v și k, să se afișeze:

  • 1. Numărul kfinal;
  • 2. Vectorul după prelucrare.

Date de intrare[edit | edit source]

Fișierul de intrare ciocin.txt conține pe prima linie numerele c (mereu 1 sau 2, reprezentând cerința ce trebuie rezolvată), n, k, iar următoarea linie va conține n numere întregi, reprezentând elementele vectorului inițial.

Date de ieșire[edit | edit source]

Fișierul de ieșire ciocout.txt va conține pe prima linie:

  • Dacă c = 1, atunci numărul kfinal;
  • Dacă c = 2, atunci vectorul după prelucrare.

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

  • 1 ≤ n, k ≤ 100.000;
  • 1≤v[i]≤2^60;
  • Pentru 40% din teste, c=1.

Exemplul 1[edit | edit source]

ciocin.txt
1 7 4
1 4 6 2 3 4 5
ciocout.txt
Datele introduse corespund restricțiilor impuse.
5

Explicație[edit | edit source]

k-ul inițial nu este suficient de cuprinzător (numărul 4 se repetă).

Exemplul 2[edit | edit source]

ciocin.txt
2 7 4
1 4 6 2 3 4 5
ciocout.txt
Datele introduse corespund restricțiilor impuse.
1 2 4 8 6 2 4 3 6 4 8 5

Explicație[edit | edit source]

Acesta este exemplul din enunț.

Exemplul 3[edit | edit source]

ciocin.txt
2 7 4
1 4 6 2 3 4 1000000001
ciocout.txt
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 2525 - Cioc

def validare(n_validare, k_validare, sir_validare): # functia de validare a datelor de intrare

   if not (1 <= n_validare <= 100000 and 1 <= k_validare <= 100000):
       raise ValueError
   for v in sir_validare:
       if not (1 <= v <= 260):
           raise ValueError
   fisier_iesire.write("Datele de intrare corespund restrictiilor impuse\n")


def prelucrare(n_prelucrare, k_prelucrare, sir_prelucrare): # functia de rezolvare a problemei

   sir_sortat = sorted([(v, i) for i, v in enumerate(sir_prelucrare)])
   k_final_prelucrare = k_prelucrare
   while k_final_prelucrare < n_prelucrare and sir_sortat[k_final_prelucrare][0] == sir_sortat[k_prelucrare-1][0]:
       k_final_prelucrare += 1
   sir_prelucrat_prelucrare = []
   for v, i in sir_sortat[:k_final_prelucrare]:
       sir_prelucrat_prelucrare.append((i, v))
       sir_prelucrat_prelucrare.append((i, v*2))
   sir_prelucrat_prelucrare.sort()
   return k_final_prelucrare, [v for i, v in sir_prelucrat_prelucrare]


if __name__ == '__main__':

   fisier_intrare = open("ciocin.txt", "r")         # declararea fisierelor
   fisier_iesire = open("ciocout.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)
   try:
       c, n, k = map(int, fisier_intrare.readline().split())
       sir = list(map(int, fisier_intrare.readline().split()))
       validare(n, k, sir)                 # apelul functiei de validare
       k_final, sir_prelucrat = prelucrare(n, k, sir)  # apelul functiei de rezolvare
       if c == 1:
           fisier_iesire.write(str(k_final) + "\n")
       else:
           fisier_iesire.write(" ".join(map(str, sir_prelucrat)) + "\n")
   except ValueError:
       fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>