3373 - culori4

From Bitnami MediaWiki

Enunț

Am o prietenă creatoare de modă. Pentru a-și realiza creațiile ea vopsește uneori materialele și mă roagă în prealabil să o ajut. Azi vrea să vopsească o pânză cu lungimea N cm folosind C nuanțe ale aceleiași culori, codificate de la 1 la C. Fiecare cm de pânză fiind colorat cu aceeași nuanță pe toată lățimea, va ieși o pânză în dungi. Inițial eu simulez cu ajutorul calculatorului vopsirea materialului, prietena mea începe apoi să intervină: de la cm A la cm B, trebuie modificată intensitatea culorii cu X puncte (intensitatea poate crește sau poate scădea, obținându-se astfel o altă nuanță). După nenumărate modificări de acest tip, să spunem M modificări, prietena mea va fi mulțumită și va trece la vopsirea efectivă a pânzei.

Cerința

Scrieţi un program care determină și afișează: 1. Lungimea maximă a unei bucăți de pânză de aceeași culoare după vopsirea inițială; 2. Cum va arăta pânza în urma modificărilor prietenei mele.

Date de intrare

Fișierul de intrare culoriin.txt conține pe prima linie cerința (1 sau 2). Linia următoare conține trei numere naturale C N M separate prin câte un spațiu, reprezentând numărul de culori, lungimea în cm a pânzei, respectiv numărul de modificări efectuate de prietena mea; următoarea linie conține N numere naturale separate prin câte un spațiu, c1 c2 c3 ... cN reprezentând culoarea fiecărui cm de pânză după vopsirea inițială, iar următoarele M linii conțin fiecare câte trei numere: două numere naturale A B, separate printr-un spațiu, reprezentând A – poziția la care începe și B – poziția finală la care se termină modificarea intensității și, separat printr-un spațiu, un număr întreg X reprezentând valoarea cu care se modifică intensitatea.

Date de ieșire

Fișierul de ieșire culoriout.txt va conține o singură linie pe care va fi scris un număr natural determinat conform cerinței, dacă cerința este 1 sau N numere naturale determinate conform cerinței, dacă cerința este 2.

Restricții și precizări

  • 1 ⩽ N ⩽ 10.000
  • 1 ⩽ C ⩽ 1.000.000
  • 1 ⩽ M ⩽ 200.000

Exemplul 1

Intrare
culoriin.txt
1
3 8 2
1 1 2 2 2 2 3 3
2 5 1
5 8 -1
Ieșire
Datele de intrare corespund restricțiilor impuse
culoriout.txt
4

Explicație

Cea mai lungă secvență de elemente egale este 2 2 2 2 și are 4 elemente

Exemplul 2

Intrare
culoriin.txt
2
3 8 2
1 1 2 2 2 2 3 3
2 5 1
5 8 -1
Ieșire
Datele de intrare corespund restricțiilor impuse
culoriout.txt
1 2 3 3 2 1 2 2

Explicație

După prima modificare vectorul este: 1 2 3 3 3 2 3 3. După a doua modificare este: 1 2 3 3 2 1 2 2.

Exemplul 3

Intrare
culoriin.txt
1
3 10001 2
1 1 2 2 2 2 3 3
2 5 1
5 8 -1
Ieșire
Datele de intrare NU corespund restricțiilor impuse

Rezolvare

<syntaxhighlight lang="python" line>

  1. 3373 - Culori4

def valideaza_date_intrare(n, c, m, culori, modificari):

   # Funcție pentru validarea datelor de intrare
   if not (0 < n < 10001):
       return False
   if not (0 < c < 1000001):
       return False
   if not (0 < m < 200001):
       return False
   if len(culori) != n:
       return False
   for culoare in culori:
       if not (1 <= culoare <= c):
           return False
   for modificare in modificari:
       a, b, x = modificare
       if not (1 <= a <= b <= n):
           return False
   return True


def proceseaza_cererea(cerere, c, n, culori, modificari):

   # Funcție pentru procesarea cererii și returnarea rezultatului
   if cerere == 1:
       # cerința 1: Lungimea maximă a unei bucăți de pânză de aceeași culoare după vopsirea inițială
       lungime_maxima = 1
       lungime_curenta = 1
       for i in range(1, n):
           if culori[i] == culori[i - 1]:
               lungime_curenta += 1
               lungime_maxima = max(lungime_maxima, lungime_curenta)
           else:
               lungime_curenta = 1
       return lungime_maxima
   elif cerere == 2:
       # cerința 2: cum va arăta pânza în urma modificărilor prietenei mele
       for modificare in modificari:
           a, b, x = modificare
           for i in range(a - 1, b):
               culori[i] = (culori[i] + x - 1) % c + 1
       return culori


def main():

   # Funcție principală care citește datele de intrare și apelează funcțiile de validare și procesare
   with open('culoriin.txt', 'r') as fisier:
       cerere = int(fisier.readline().strip())
       c, n, m = map(int, fisier.readline().split())
       culori = list(map(int, fisier.readline().split()))
       modificari = [list(map(int, fisier.readline().split())) for _ in range(m)]
   if valideaza_date_intrare(n, c, m, culori, modificari):
       print("Datele de intrare corespund restricțiilor impuse")
   else:
       print("Datele de intrare NU corespund restricțiilor impuse")
       return
   rezultat = proceseaza_cererea(cerere, c, n, culori, modificari)
   with open('culoriout.txt', 'w') as fisier:
       if cerere == 1:
           fisier.write(str(rezultat))
       elif cerere == 2:
           fisier.write(" ".join(map(str, rezultat)))


if __name__ == "__main__":

   main()

</syntaxhighlight>