3406 - As Easy As ABC
Cerința[edit | edit source]
Fie N un număr întreg impar și un vector A cu N elemente. Pentru fiecare element , acesta se poate incrementa cu 1. Fiecare element sepoate incrementa cel mult odată. Mai mult, se pot realiza cel mult K incrementări. Scopul este de a maximiza medianul lui A. Medianul unui vector este definit ca fiind elementul din mijlocul vectorului după sortarea acestuia. De exemplu, medianul vectorului [5, 8, 2, 9, 1] este 5.
Date de intrare[edit | edit source]
Prima linie conține un număr impar N și un întreg K. Pe a doua linie se află N numere separate prin spații naturale, reprezentând elementele vectorului.
Date de ieșire[edit | edit source]
Programul va afișa pe ecran numărul ce reprezintă maximul posibil al medianului după aplicarea operațiilor de incrementare.
Restricții și precizări[edit | edit source]
- 1 ≤ k ≤ n ≤ 1000, N e impar;
- 1 ≤ ≤ 1000;
Exemplul 1[edit | edit source]
- Intrare
- 9 3
- 4 4 4 8 2 2 9 9 1
- Ieșire
- Datele de intrare corespund restricțiilor impuse.
- 5
Explicație[edit | edit source]
- Se pot incrementa elementele de pe pozițiile 1, 2 și 3. Valoarea comună reprezintă medianul maxim care se poate obține.
Exemplul 2[edit | edit source]
- Intrare
- 0 0
- 0 0
- Ieșire
- Datele de intrare nu corespund restricțiilor impuse.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1">
- 3406 - As Easy As ABC
def maximize_median(vector, k):
n = len(vector) mid = n // 2 median = vector[mid]
- pentru a crește valoarea medianei, vom parcurge elementele din stânga acesteia
for i in range(mid - 1, -1, -1): if k <= 0: break
- calculăm diferența dintre valoarea medianei și elementul curent i, din stânga ei
- această diferență trebuie să fie mai mică sau egală cu numărul de operații disponibile k
diff = min(vector[mid] - vector[i], k // (mid - i)) # creștem valoarea medianei cu diferența calculată median += diff
- scădem din numărul total de operații k, numărul de operații realizate, pentru a crește valoarea medianei
k -= diff * (mid - i)
- pentru a crește valoarea medianei, vom parcurge elementele din dreapta medianei
for i in range(mid + 1, n): if k <= 0: break # calculăm diferența dintre elementul curent i din dreapta medianei și valoarea acesteia # diferența trebuie să fie mai mică sau egală cu numărul de operații disponibile k diff = min(vector[i] - vector[mid], k // (i - mid)) # creștem valoarea medianei cu diferența calculată median += diff
- scădem din numărul total de operații k, numărul de operații realizate pentru a crește valoarea medianei
k -= diff * (i - mid)
# returnăm valoarea maximă a medianei return median
if __name__ == "__main__":
# citim numărul n de elemente din vector și numărul k de operații care pot fi realizate # elementele vectorului sunt sub forma de listă de numere n, k = map(int, input().split()) vector = list(map(int, input().split()))
# verificăm restricțiile if n % 2 == 0 or n < 1 or n > 1000 or k < 1 or k > n or any(a < 1 or a > 1000 for a in vector): print("Datele de intrare nu corespund restricțiilor impuse.") else: print("Datele de intrare corespund restricțiilor impuse.") vector.sort() max_median = maximize_median(vector, k) # în caz contrar, apelăm funcția și afișăm valoarea maximă a medianei print(max_median)
</syntaxhighlight>