3865 - Water Front: Difference between revisions
Andrada378 (talk | contribs) Pagină nouă: Enunt: Pe faleza râului Prahova primarul oraşului Ploieşti a plantat un şir de N arbuşti ornamentali de diverse soiuri, fiecare arbust i având iniţial înălţimea height[i], 1 ≤ i ≤ N. În funcţie de solul în care este plantat şi de vreme, arbustul i creşte zilnic cu înălţimea dailyGrowth[i]. În fiecare zi grădinarul primăriei ajustează, prin tăiere cu o foarfecă, înălţimea arbuştilor. Totuşi, grădinarul este limitat de detaliile tehnice ale f... |
Andrada378 (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
Enunt | == Enunt == | ||
Pe faleza râului Prahova primarul oraşului Ploieşti a plantat un şir de N arbuşti ornamentali de diverse soiuri, fiecare arbust i având iniţial înălţimea height[i], 1 ≤ i ≤ N. În funcţie de solul în care este plantat şi de vreme, arbustul i creşte zilnic cu înălţimea dailyGrowth[i]. | Pe faleza râului Prahova primarul oraşului Ploieşti a plantat un şir de N arbuşti ornamentali de diverse soiuri, fiecare arbust i având iniţial înălţimea height[i], 1 ≤ i ≤ N. În funcţie de solul în care este plantat şi de vreme, arbustul i creşte zilnic cu înălţimea dailyGrowth[i]. | ||
Line 7: | Line 6: | ||
Atenție! În fiecare zi arbustul întâi crește și apoi se fac tăierile. | Atenție! În fiecare zi arbustul întâi crește și apoi se fac tăierile. | ||
Cerinta | == Cerinta == | ||
Primarul organizează după M zile un eveniment artistic şi doreşte să aflaţi care este înălţimea minimă a celui mai înalt arbust după cele M zile. | Primarul organizează după M zile un eveniment artistic şi doreşte să aflaţi care este înălţimea minimă a celui mai înalt arbust după cele M zile. | ||
Date de intrare: | == Date de intrare: == | ||
De la tastatură se citesc de pe prima linie numerele naturale N, M, k şi x. Pe următoarele N linii se află câte două numere naturale height[i] şi dailyGrowth[i], separate prin spaţiu. | De la tastatură se citesc de pe prima linie numerele naturale N, M, k şi x. Pe următoarele N linii se află câte două numere naturale height[i] şi dailyGrowth[i], separate prin spaţiu. | ||
Date de iesire | == Date de iesire == | ||
Afișați la ecran un număr nenegativ reprezentând înălţimea minimă a celui mai înalt arbust după cele M zile. | Afișați la ecran un număr nenegativ reprezentând înălţimea minimă a celui mai înalt arbust după cele M zile. | ||
Restrictii si precizari: | == Restrictii si precizari: == | ||
* 1 ≤ k ≤ 1.000 | |||
* 1 ≤ x ≤ 10.000 | |||
* 0 ≤ height[i] ≤ 10.000 | |||
* 0 ≤ dailyGrowth[i] ≤ 10.000 | |||
* Pentru 8 puncte, N ≤ 100, M = 1, k = 1, x = 1, height[i] ≥ 1, dailyGrowth[i] = 0 | |||
* Pentru 22 puncte, 1 ≤ N, M ≤ 500 | |||
* Pentru 43 puncte, 1 ≤ N, M 5.000 | |||
* Pentru 27 puncte, 1 ≤ N, M ≤ 10.000 | |||
Intrare | == Exemplu == | ||
'''Intrare''' | |||
4 3 4 3 | 4 3 4 3 | ||
Line 51: | Line 39: | ||
2 8 , fara spatiu intre randuri | 2 8 , fara spatiu intre randuri | ||
Iesire | '''Iesire''' | ||
8 | 8 | ||
Rezolvare | == Rezolvare == | ||
<syntaxhighlight lang="python"> | |||
def validate_data(N, M, k, x, heights, daily_growths): | |||
# Validare pentru k și x | |||
if not (1 <= k <= 1000 and 1 <= x <= 10000): | |||
print("Eroare: k și x trebuie să fie în intervalul 1 ≤ k ≤ 1000 și 1 ≤ x ≤ 10000.") | |||
exit() | |||
# Validare pentru N, M, height și dailyGrowth | |||
if not (1 <= N <= 5000 and 1 <= M <= 10000): | |||
print("Eroare: N trebuie să fie în intervalul 1 ≤ N ≤ 5000 și M trebuie să fie în intervalul 1 ≤ M ≤ 10000.") | |||
exit() | |||
if not all(0 <= height <= 10000 for height in heights): | |||
print("Eroare: Înălțimile trebuie să fie în intervalul 0 ≤ height[i] ≤ 10000.") | |||
exit() | |||
if not all(0 <= growth <= 10000 for growth in daily_growths): | |||
print("Eroare: Creșterile zilnice trebuie să fie în intervalul 0 ≤ dailyGrowth[i] ≤ 10000.") | |||
exit() | |||
def calculate_height(N, M, k, x, heights, daily_growths): | |||
max_height = max(heights) | |||
for day in range(M): | |||
cut_heights = [min(heights[i], k * x) for i in range(N)] # Înălțimile pe care le putem tăia în ziua respectivă | |||
total_cut = min(sum(cut_heights), k * x * N) # Totalul pe care îl putem tăia în ziua respectivă | |||
for i in range(N): | |||
cut = min(heights[i], total_cut) # Cantitatea pe care o tăiem din arbustul i | |||
heights[i] -= cut # Efectuăm tăierea | |||
total_cut -= cut # Scădem cantitatea tăiată din total | |||
heights[i] += daily_growths[i] # Creștem înălțimile zilnice | |||
max_height = max(max(heights), max_height) | |||
return max_height | |||
def main(): | def main(): | ||
N, M, k, x = map(int, input().split()) | |||
heights = [] | |||
daily_growths = [] | |||
for _ in range(N): | |||
h, d = map(int, input().split()) | |||
heights.append(h) | |||
daily_growths.append(d) | |||
result = calculate_height(N, M, k, x, heights, daily_growths) | |||
print(result) | |||
if __name__ == "__main__": | if __name__ == "__main__": | ||
main() | |||
</syntaxhighlight> |
Latest revision as of 13:10, 5 January 2024
Enunt[edit | edit source]
Pe faleza râului Prahova primarul oraşului Ploieşti a plantat un şir de N arbuşti ornamentali de diverse soiuri, fiecare arbust i având iniţial înălţimea height[i], 1 ≤ i ≤ N. În funcţie de solul în care este plantat şi de vreme, arbustul i creşte zilnic cu înălţimea dailyGrowth[i].
În fiecare zi grădinarul primăriei ajustează, prin tăiere cu o foarfecă, înălţimea arbuştilor. Totuşi, grădinarul este limitat de detaliile tehnice ale foarfecii. Astfel, acesta poate tăia la o tăietură exact x centimetri din înălţimea unui arbust dacă înălțimea este cel puțin x (de notat faptul că arbustul poate ajunge la înălțimea 0 după o tăietură). Pentru a nu se obosi, grădinarul poate să efectueze într-o zi cel mult k tăieturi. Grădinarul poate să efectueze mai multe tăieturi asupra unui arbust într-o zi.
Atenție! În fiecare zi arbustul întâi crește și apoi se fac tăierile.
Cerinta[edit | edit source]
Primarul organizează după M zile un eveniment artistic şi doreşte să aflaţi care este înălţimea minimă a celui mai înalt arbust după cele M zile.
Date de intrare:[edit | edit source]
De la tastatură se citesc de pe prima linie numerele naturale N, M, k şi x. Pe următoarele N linii se află câte două numere naturale height[i] şi dailyGrowth[i], separate prin spaţiu.
Date de iesire[edit | edit source]
Afișați la ecran un număr nenegativ reprezentând înălţimea minimă a celui mai înalt arbust după cele M zile.
Restrictii si precizari:[edit | edit source]
- 1 ≤ k ≤ 1.000
- 1 ≤ x ≤ 10.000
- 0 ≤ height[i] ≤ 10.000
- 0 ≤ dailyGrowth[i] ≤ 10.000
- Pentru 8 puncte, N ≤ 100, M = 1, k = 1, x = 1, height[i] ≥ 1, dailyGrowth[i] = 0
- Pentru 22 puncte, 1 ≤ N, M ≤ 500
- Pentru 43 puncte, 1 ≤ N, M 5.000
- Pentru 27 puncte, 1 ≤ N, M ≤ 10.000
Exemplu[edit | edit source]
Intrare
4 3 4 3
2 5
3 2
0 4
2 8 , fara spatiu intre randuri
Iesire
8
Rezolvare[edit | edit source]
<syntaxhighlight lang="python"> def validate_data(N, M, k, x, heights, daily_growths):
# Validare pentru k și x if not (1 <= k <= 1000 and 1 <= x <= 10000): print("Eroare: k și x trebuie să fie în intervalul 1 ≤ k ≤ 1000 și 1 ≤ x ≤ 10000.") exit()
# Validare pentru N, M, height și dailyGrowth if not (1 <= N <= 5000 and 1 <= M <= 10000): print("Eroare: N trebuie să fie în intervalul 1 ≤ N ≤ 5000 și M trebuie să fie în intervalul 1 ≤ M ≤ 10000.") exit()
if not all(0 <= height <= 10000 for height in heights): print("Eroare: Înălțimile trebuie să fie în intervalul 0 ≤ height[i] ≤ 10000.") exit()
if not all(0 <= growth <= 10000 for growth in daily_growths): print("Eroare: Creșterile zilnice trebuie să fie în intervalul 0 ≤ dailyGrowth[i] ≤ 10000.") exit()
def calculate_height(N, M, k, x, heights, daily_growths):
max_height = max(heights)
for day in range(M): cut_heights = [min(heights[i], k * x) for i in range(N)] # Înălțimile pe care le putem tăia în ziua respectivă
total_cut = min(sum(cut_heights), k * x * N) # Totalul pe care îl putem tăia în ziua respectivă
for i in range(N): cut = min(heights[i], total_cut) # Cantitatea pe care o tăiem din arbustul i heights[i] -= cut # Efectuăm tăierea total_cut -= cut # Scădem cantitatea tăiată din total heights[i] += daily_growths[i] # Creștem înălțimile zilnice
max_height = max(max(heights), max_height)
return max_height
def main():
N, M, k, x = map(int, input().split())
heights = [] daily_growths = []
for _ in range(N): h, d = map(int, input().split()) heights.append(h) daily_growths.append(d)
result = calculate_height(N, M, k, x, heights, daily_growths) print(result)
if __name__ == "__main__":
main()
</syntaxhighlight>