3400 - culori5
Enunț
Î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
Scrieţi un program care să găsească numărul minim de culori ce vor fi folosite pentru a colora gardul.
Date de intrare
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
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
- 1 ⩽ K ⩽ 200.000
- 1 ⩽K⩽ N ⩽ 1.000.000
- 1 ⩽ Hi ⩽ 1.000
Exemplul 1
- 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
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
- Intrare
- culoriin.txt
- 4 6
- 1 1 2 1 3 2
- Ieșire
- Datele de intrare NU corespund restricțiilor impuse
Rezolvare
#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)