1727 - Culori 3

From Bitnami MediaWiki
Revision as of 11:22, 5 February 2024 by Raul (talk | contribs) (Pagină nouă: Fiecare dintre cei <code>N</code> copii, numerotați de la <code>1</code> la <code>N</code>, primește câte un cartonaș colorat. Doamna dirigintă îi așează în cerc, în ordinea numerotării, în sens orar. Astfel, fiecare copil are doi vecini, așezați în stânga, respectiv în dreapta lui. Andrei, pasionat de informatică, asociază fiecărei culori distincte un cod, reprezentat printr-un număr natural nenul, și inscripționează fiecare cartonaș cu codul cores...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Fiecare dintre cei N copii, numerotați de la 1 la N, primește câte un cartonaș colorat. Doamna dirigintă îi așează în cerc, în ordinea numerotării, în sens orar. Astfel, fiecare copil are doi vecini, așezați în stânga, respectiv în dreapta lui.

Andrei, pasionat de informatică, asociază fiecărei culori distincte un cod, reprezentat printr-un număr natural nenul, și inscripționează fiecare cartonaș cu codul corespunzător culorii acestuia.

Cerința[edit | edit source]

Scrieţi un program care citeşte două numere naturale N şi K şi determină pentru Andrei:

a) numărul copiilor din cerc care au cartonaşe de aceeaşi culoare cu cartonaşele vecinilor;

b) numărul maxim de cartonaşe de aceeaşi culoare ce sunt deţinute de copiii aşezaţi pe K poziţii consecutive în cercul format.

Date de intrare[edit | edit source]

Fişierul de intrare culori.in conţine pe prima linie numerele naturale N şi K, separate printr-un spaţiu, şi pe fiecare dintre următoarele N linii, câte un număr natural. Cele N numere reprezintă codurile culorilor cartonaşelor, în ordinea numerotării copiilor, începând cu copilul 1.

Date de ieșire[edit | edit source]

Fişierul de ieşire culori.out conţine:

pe prima linie, numărul natural determinat la cerinţa a);

pe a doua linie, numărul natural determinat la cerinţa b).

Restricții și precizări[edit | edit source]

  • 2 < N ≤ 1000
  • 2 < K ≤ N
  • codurile culorilor sunt numere naturale nenule, consecutive, mai mici sau egale cu 100
  • dacă C este codul maxim asociat unei culori ( 1 ≤ C ≤ 100 ) atunci există cel puţin C cartonaşe care au codurile distincte: 1,2,3,…,C.

Exemplu:[edit | edit source]

culori.in

8 5
3
1
2
1
1
1
3
3

culori.out

2
4

Explicație[edit | edit source]

Sunt doi copii care au, fiecare, cartonaşe identice cu cei doi vecini (copilul 5 şi copilul 8).

Numărul maxim de cartonaşe de aceeaşi culoare deţinute de copiii aşezaţi pe K = 5 poziţii consecutive în cercul format este 4 (dintre copiii 2,3,4,5,6 doar copiii 2,4,5 şi 6 au cartonaşe de culoarea 1).

Încărcare soluție[edit | edit source]

Lipește codul aici[edit | edit source]

<syntaxhighlight lang="python" line="1"> def read_input(filename):

   with open(filename, 'r') as fin:
       N, k = map(int, fin.readline().split())
       x = [0] * (2 * N + 3)
       x[1] = int(fin.readline())
       x[N + 1] = x[1]
       c = x[1]
       x[2] = int(fin.readline())
       x[N + 2] = x[2]
       if x[2] > c:
           c = x[2]
       for i in range(3, N + 1):
           x[i] = int(fin.readline())
           x[N + i] = x[i]
           if x[i] > c:
               c = x[i]
       nrc = sum(1 for i in range(2, N) if x[i - 1] == x[i - 2] == x[i])
       if x[1] == x[N] == x[N - 1]:
           nrc += 1
       if x[1] == x[2] == x[N]:
           nrc += 1
   return N, k, x, c, nrc

def main():

   N, k, x, c, nrc = read_input('culori.in')
   maxck = 0
   apc1 = [0] * (c + 1)
   for i in range(1, k + 1):
       apc1[x[i]] += 1
       maxck = max(maxck, apc1[x[i]])
   for i in range(2, N + 1):
       apc1[x[i - 1]] -= 1
       apc1[x[i + k - 1]] += 1
       for j in range(1, c + 1):
           maxck = max(maxck, apc1[j])
   with open('culori.out', 'w') as fout:
       fout.write(f"{nrc}\n{maxck}\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>