3400 - culori5

From Bitnami MediaWiki

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

  1. 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>