3406 - As Easy As ABC

De la Universitas MediaWiki



Cerința

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

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

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

  • 1 ≤ k ≤ n ≤ 1000, N e impar;
  • 1 ≤ ≤ 1000;

Exemplul 1

Intrare
9 3
4 4 4 8 2 2 9 9 1
Ieșire
Datele de intrare corespund restricțiilor impuse.
5

Explicație

Se pot incrementa elementele de pe pozițiile 1, 2 și 3. Valoarea comună reprezintă medianul maxim care se poate obține.

Exemplul 2

Intrare
0 0
0 0
Ieșire
Datele de intrare nu corespund restricțiilor impuse.

Rezolvare

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