2525 - Cioc
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">
- 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>