3400 - culori5
Enunț[edit | edit source]
În jurul muzeului din orașul Smallville exista un gard ce conține N scânduri de înălțimi diferite. Putem spune că scândura i are înălțimea Hi. Directorul muzeului le-a cerut angajaților să vopsească acest gard cu un număr minim de culori, astfel încât să se respecte următoarea condiție: pentru un număr întreg K cunoscut, orice secvență de K scânduri consecutive nu trebuie să conțină două scânduri de aceeași înălțime, colorate identic.
Cerința[edit | edit source]
Scrieţi un program care să găsească numărul minim de culori ce vor fi folosite pentru a colora gardul.
Date de intrare[edit | edit source]
Fișierul de intrare culoriin.txt conține pe prima linie N K – două numere întregi reprezentând numărul de scânduri și lungimea secvenței. Pe următoarea linie, N numere naturale Hi reprezentand înălțimile celor N scânduri
Date de ieșire[edit | edit source]
Fișierul de ieșire culoriout.txt va conține un număr întreg C reprezentând numărul minim de culori folosite.
Restricții și precizări[edit | edit source]
- 1 ⩽ K ⩽ 200.000
- 1 ⩽K⩽ N ⩽ 1.000.000
- 1 ⩽ Hi ⩽ 1.000
Exemplul 1[edit | edit source]
- Intrare
- culoriin.txt
- 6 4
- 1 1 2 1 3 2
- Ieșire
- Datele de intrare corespund restricțiilor impuse
- culoriout.txt
- 3
Explicație[edit | edit source]
O posibilă colorare a scândurilor folosind culorile 1, 2, 3 este: 1 2 1 3 1 2. Există 3 secvențe: 1 1 2 1, 1 2 1 3 și 2 1 3 2 și orice secvență respectă condiția din enunț.
Exemplul 2[edit | edit source]
- Intrare
- culoriin.txt
- 4 6
- 1 1 2 1 3 2
- Ieșire
- Datele de intrare NU corespund restricțiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 3400 - Culori5
def validare_date(n, k, hi):
if not (1 <= k <= 200000): return False if not (1 <= k <= n <= 1000000): return False if not all(1 <= h <= 1000 for h in hi): return False return True
def numar_minim_culori(n, k, hi):
culori = 0 culoare_actuala = {}
for i in range(n): inaltime = hi[i]
if inaltime not in culoare_actuala: culoare_actuala[inaltime] = 1 culori = max(culori, 1) else: culoare_actuala[inaltime] += 1 culori = max(culori, culoare_actuala[inaltime])
if i >= k - 1: culoare_actuala[hi[i - k + 1]] -= 1
return culori
if __name__ == "__main__":
with open("culoriin.txt", "r") as fin: n, k = map(int, fin.readline().split()) hi = list(map(int, fin.readline().split()))
if validare_date(n, k, hi): print("Datele de intrare corespund restricțiilor impuse") rezultat = numar_minim_culori(n, k, hi) with open("culoriout.txt", "w") as fout: fout.write(str(rezultat)) else: print("Datele de intrare NU corespund restricțiilor impuse") exit(0)
</syntaxhighlight>