3865 - Water Front
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 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:
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:
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
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:
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:
Intrare:
4 3 4 3
2 5
3 2
0 4
2 8 , fara spatiu intre randuri
Iesire
8
Rezolvare
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()