Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
3607 - Run
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
== Cerinţa == Î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 == 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 == 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 == * '''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 == ; 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 == 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'''. <br> == Rezolvare == <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>
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width