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
3262 - Rain
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!
Bariere impermeabile de înălțimi diferite sunt plasate perpendicular pe lungimea unei cuve dreptunghiulare. Distanța dintre oricare două bariere alăturate este de un centimetru. Cuva nu are capac și atunci când plouă destul, cuva este umplută cu apă. Unele bariere pot fi înălțate cu o valoare întreagă care nu poate depăși o valoare dată. = Cerința = Care este numărul minim de bariere care trebuie înălțate astfel încât să fie colectată în cuvă o cantitate maximă de apă? = Date de intrare = Programul citește de pe prima linie numărul <code>n</code> de bariere. A doua linie conține înălțimile celor <code>n</code> bariere, luate de la stânga la dreapta. A treia linie conține numărul <code>k</code> de bariere cărora li se poate crește înălțimea. Urmează atâtea linii câte bariere sunt cărora le putem crește înălțimea. Fiecare din aceste linii conține numărul barierei și creșterea maximă în centimetri în înălțime care se poate face. Numerotarea barierelor se face începând cu <code>0</code>. = Date de ieșire = Programul va afișa pe ecran doi întregi separați prin spațiu, numărul minim de bariere cărora li se va mări înălțimea și cantitatea maximă de apă ce poate fi colectată după mărire. Observație: Se calculează cantitatea în centimetri cubi deoarece considerăm adâncimea cuvei de un centimetru. Considerăm fața și spatele pereți ai cuvei (cea care este înspre noi și cea care este în spate) ca fiind mai înalte decât înălțimea oricărei bariere. Pereții din stânga și din dreapta ai cuvei coincid cu cea mai din stânga și respectiv cea mai din dreapta barieră, chiar și după ce acestea vor fi eventual înălțate. = Restricții și precizări = * <code>1 < n < 1.000.000</code> * <code>0 < k ≤ n</code> * înălțimile inițiale ale celor <code>n</code> bariere sunt numere naturale mai mici sau egale cu <code>1.000.000</code> * barierele vor fi înălțate cu maximum <code>1.000.000</code> = Exemplu: = Intrare 6 2 4 2 4 2 1 2 2 1 4 1 Ieșire 1 14 === Explicație === Nu se crește înălțimea barierei <code>2</code> deoarece nu va modifica întreaga cantitate de apă. Vom crește cu <code>1</code> centimetru înălțimea barierei de la poziția <code>4</code>, care va mări cantitatea totală de apă cu <code>1</code> centimetru cub. == Rezolvare == <syntaxhighlight lang="python3"> nMax = 1000000 H = [0] * nMax max_dH = [0] * nMax LR = [] RL = [] n = 0 dn = 0 KL = 0 KR = 0 countB = 0 volume = 0 L = -1 R = -1 def input_data(): global n, H, dn, max_dH n = int(input()) H[:n] = map(int, input().split()) dn = int(input()) for _ in range(dn): j, dH = map(int, input().split()) max_dH[j] = dH H[j] += dH def scan(): global KL, KR, L, R KL = 0 for i in range(1, n): if H[KL] < H[i]: L = KL LR.append(KL) KL = i KR = n - 1 for i in range(n - 2, KL - 1, -1): if H[KR] < H[i]: R = KR RL.append(KR) KR = i def solve(): global countB, volume, L, R if LR: LR.append(KL) for i in range(len(LR) - 1): if max_dH[LR[i]] > 0: countB += 1 volume += H[LR[i]] * (LR[i + 1] - LR[i]) if RL: RL.append(KR) for i in range(len(RL) - 1): if max_dH[RL[i]] > 0: countB += 1 volume += H[RL[i]] * (RL[i] - RL[i + 1]) if KL < KR: if max_dH[KL] > 0: countB += 1 if max_dH[KR] > 0: countB += 1 volume += H[KL] * (KR - KL) else: HLmax = H[L] if L != -1 else 0 HRmax = H[R] if R != -1 else 0 if HLmax != HRmax: if H[KL] - max_dH[KL] < max(HRmax, HLmax): countB += 1 def main(): input_data() scan() solve() print(countB, volume) if __name__ == "__main__": main() </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