3400 - culori5

De la Universitas MediaWiki

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 ⩽KN ⩽ 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)