3865 - Water Front: Diferență între versiuni

De la Universitas MediaWiki
(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...)
 
Fără descriere a modificării
 
Linia 1: Linia 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].


Linia 7: Linia 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


Exemplu:
* 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
Linia 51: Linia 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()


def calculate_height(N, M, k, x, heights, daily_growths):
    # 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()


    max_height = max(heights)
    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()


    for day in range(M):
    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()


        cut_heights = [min(heights[i], k * x) for i in range(N)]  # Înălțimile pe care le putem tăia în ziua respectivă
def calculate_height(N, M, k, x, heights, daily_growths):
 
    max_height = max(heights)
        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
    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ă


            heights[i] -= cut  # Efectuăm tăierea
        total_cut = min(sum(cut_heights), k * x * N)  # Totalul pe care îl putem tăia în ziua respectivă


            total_cut -= cut  # Scădem cantitatea tăiată din total
        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


            heights[i] += daily_growths[i]  # Creștem înălțimile zilnice
        max_height = max(max(heights), max_height)


        max_height = max(max(heights), max_height)
    return max_height
 
    return max_height


def main():
def main():
    N, M, k, x = map(int, input().split())


    N, M, k, x = map(int, input().split())
    heights = []
 
    daily_growths = []
    heights = []
 
    daily_growths = []
 
    for _ in range(N):
 
        h, d = map(int, input().split())
 
        heights.append(h)


        daily_growths.append(d)
    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)
    result = calculate_height(N, M, k, x, heights, daily_growths)
 
    print(result)
    print(result)


if __name__ == "__main__":
if __name__ == "__main__":
 
    main()
    main()
</syntaxhighlight>

Versiunea curentă din 5 ianuarie 2024 13:10

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 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()