3607 - Run
Cerinţa[edit | edit source]
În această dimineață Aky, un băiat sportiv, s-a hotărât să meargă la alergat. Acesta vrea după ce ajunge acasă să își rezolve tema la informatică și pentru asta trebuie să nu fie foarte obosit în urma antrenamentului, deci vrea să își aleagă un traseu cât mai ușor pe care să alerge, iar pentru asta și-a pus la punct un plan foarte exact.
Acesta are în orașul său o distanță N kilometri legați, numerotați de la 1 la N, iar fiecărui kilometru i din cele N(1 ≤ i ≤ N) îi cunoaște gradul de dificultate a[i]. Băiatul a întocmit o listă cu M intervale diferite de kilometri de forma [l, r], fiecare interval având un anumit grad de oboseală asociat acestuia. Gradul de oboseală G asociat unui interval [l, r] de lungime L = r - l + 1 se calculează astfel: G = a[l] * L + a[l + 1] * (L - 1) + ... + a[r - 1] * 2 + a[r] * 1 și reprezintă cu cât va crește valoarea de oboseală a lui Aky dupa ce va alerga kilometrii intervalului respectiv. Acum Aky vă cere vouă să-l ajutați să-și ducă planul la sfârșit, aflând care este valoarea minimă de oboseală pe care o poate avea la finalul antrenamentului său, știind că trebuie sa alerge kilometrii a exact K din intervalele din lista sa.
Date de intrare[edit | edit source]
Fişierul de intrare run.in are pe prima linie numerele N M K, reprezentând numărul de kilometri din orașul lui Aky, numărul de intervale din lista sa, respectiv câte dintre intervale trebuie să aleagă pentru alergat, pe a 2-a linie N numere naturale a[1], a[2], ..., a[N], reprezentând gradele de dificultate ale celor N kilometri, iar pe următoarele M linii câte 2 numere l r reprezentând intervalele din lista lui Aky.
Date de ieșire[edit | edit source]
Fişierul de ieşire run.out va conţine pe prima linie numărul natural V, reprezentând valoarea minimă de oboseală pe care o poate avea băiatul la finalul antrenamentului său.
Restricţii şi precizări[edit | edit source]
- 1 ≤ N, M ≤ 100.000
- 1 ≤ K ≤ M
- 1 ≤ a[i] ≤ 10.000
- 1 ≤ l ≤ r ≤ n
- pentru teste în valoare de 50 de puncte N ≤ 5.000 și M ≤ 5.000
Exemplul 1[edit | edit source]
- run.in
5 5 3 2 3 1 5 6 1 3 1 4 3 4 2 5 4 5
- run.out
36
Explicație[edit | edit source]
Vom lua fiecare interval și vom calcula gradul său de oboseală:
- [1, 3]: G = 2 * 3 + 3 * 2 + 1 * 1 = 13
- [1, 4]: G = 2 * 4 + 3 * 3 + 1 * 2 + 5 * 1 = 24
- [3, 4]: G = 1 * 2 + 5 * 1 = 7
- [2, 5]: G = 3 * 4 + 1 * 3 + 5 * 2 + 6 * 1 = 31
- [4, 5]: G = 5 * 2 + 6 * 1 = 16
Obținem în final gradele de oboseală 13 24 7 31 16 din care Aky trebuie să aleagă 3 astfel încât valoarea sa de oboseală să fie minimă. Acesta elege primul, al treilea, respectiv ultimul interval obținând valoarea de oboseală minimă 13 + 7 + 16 = 36.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> with open("run.in", "r") as fin:
N, M, K = map(int, fin.readline().split()) difficulties = list(map(int, fin.readline().split())) intervals = [tuple(map(int, fin.readline().split())) for _ in range(M)]
def fatigue(interval, difficulties):
l, r = interval fatigue_value = 0 for i in range(l, r + 1): fatigue_value += difficulties[i - 1] * (r - i + 1) return fatigue_value
sorted_intervals = sorted(intervals, key=lambda interval: fatigue(interval, difficulties)) min_fatigue = sum(fatigue(interval, difficulties) for interval in sorted_intervals[:K])
with open("run.out", "w") as fout:
fout.write(str(min_fatigue))
</syntaxhighlight>