1046 - Munte

From Bitnami MediaWiki

Se consideră un şir x1, x2,…, xn format din n numere naturale distincte. O secvenţă de număr maxim de elemente vecine în şir, de forma xi, xi+1,…, xk-1, xk, xk+1,…, xj (1≤i<k<j≤n) cu proprietatea că xi < xi+1 < ...< xk-1 < xk > xk+1 > ... > xj, se numeşte munte cu vârful xk. Două secvenţe munte au maxim un element comun în şir. O secvenţă munte are cel puţin 3 elemente. Un exemplu de şir format cu valorile 3 4 6 8 nu conţine nicio secvenţă munte, iar unul format cu valorile 3 4 8 1 2 5 0 conţine 2 secvenţe munte: 3 4 8 1 şi 1 2 5 0.

După determinarea tuturor secvenţelor munte şi a vârfurilor acestora, se elimină din şir vârfurile secvenţelor munte şi procedura continuă repetat cu determinarea noilor secvenţe munte şi a vârfurilor lor din şirul nou obţinut. Procedura se opreşte în momentul în care în şir nu mai există nicio secvenţă munte.

Cerința[edit | edit source]

Scrieţi un program care citeşte numerele n, x1, x2, …, xn şi apoi determină:

a) numărul de secvenţe munte din şirul iniţial;

b) numărul total de secvenţe munte obţinute pornind de la şirul iniţial până la cel care nu mai conţine nicio secvenţă munte;

c) numărul de elemente din şirul final care nu mai conţine secvenţe munte.

Date de intrare[edit | edit source]

Fișierul de intrare munte.in conține pe prima linie numărul n, iar pe următoarea linie numerele naturale x1, x2,…, xn separate două câte două prin câte un spaţiu.

Date de ieșire[edit | edit source]

Fișierul de ieșire munte.out va conține pe prima linie un număr natural conform cerinţei a), pe a doua linie un număr natural conform cerinţei b), pe a treia linie un număr natural conform cerinţei c).

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

  • 3 ≤ n ≤ 100
  • 0 ≤ xi ≤ 100000, 1 ≤ i ≤ n
  • Pentru rezolvarea corectă a cerinţei a) se obţine 20% din punctaj.
  • Pentru rezolvarea corectă a cerinţei b) se obţine 40% din punctaj.
  • Pentru rezolvarea corectă a cerinţei c) se obţine 40% din punctaj. Pentru testele date se asigură că şirul de numere dat iniţial conţine cel puţin o secvenţă munte.

Exemplu:[edit | edit source]

munte.in

8
1 2 5 0 6 9 3 4

munte.out

2
4
4

Explicație[edit | edit source]

a) Sunt două secvenţe munte: 1 2 5 0 şi 0 6 9 3

b) După eliminarea vârfurilor secvenţelor munte, şirul nou este 1 2 0 6 3 4. Acest şir conţine 2 secvenţe munte: 1 2 0 şi 0 6 3. După eliminarea vârfurilor secvenţelor munte, şirul nou este 1 0 3 4. Noul şir nu mai conţine nicio secvenţă munte. În total sunt deci 4 secvenţe.

c) Şirul final care nu mai conţine secvenţe munte 1 0 3 4 are 4 elemente

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

Lipește codul aici[edit | edit source]

<syntaxhighlight lang="python" line="1"> MAX = 1000000

fin = open("munte.in", "r") fout = open("munte.out", "w")

n = 0 i = 0 j = 0 parcurgere = 0 munti = 0 cati = 0 x = [0] * 110 gasit_munte = False

n = int(fin.readline()) x = list(map(int, fin.readline().split()))

parcurgere = 1 gasit_munte = True while gasit_munte:

   gasit_munte = False
   cati = 0
   i = 0
   while i < n and x[i] > x[i + 1]:
       i += 1
   while i <= n:
       while i < n and x[i] < x[i + 1]:
           i += 1
       if i < n:
           munti += 1
           cati += 1
           x[i] = MAX
           gasit_munte = True
       while i < n and x[i] > x[i + 1]:
           i += 1
       if i < n and x[i] > x[i - 1]:
           i -= 1
       else:
           if i == n:
               break
   if parcurgere == 1:
       fout.write(str(munti) + '\n')
       parcurgere += 1
   i = 0
   while i < n:
       while x[i] != MAX and i < n:
           i += 1
       for j in range(i, n):
           x[j] = x[j + 1]
   if gasit_munte:
       n -= cati

fout.write(str(munti) + '\n') fout.write(str(n) + '\n') fin.close() fout.close() </syntaxhighlight>