0181 - SecvCresc

From Bitnami MediaWiki
Revision as of 21:44, 21 March 2023 by Flaviu (talk | contribs) (Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/181/secvcresc 0181 - SecvCresc] ---- == Cerinţa == Se dau n numere naturale, reprezentând elementele unui vector. Determinați cea mai lungă secvență de elemente ordonate strict crescător din vector. Dacă există mai multe astfel de secvențe se va determina cea mai din stânga. == Date de intrare == Fișierul de intrare secvcresc.in conține numărul n și n valori naturale, reprezentând elementele vectorului. Valorile din fi...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursa: 0181 - SecvCresc


Cerinţa

Se dau n numere naturale, reprezentând elementele unui vector. Determinați cea mai lungă secvență de elemente ordonate strict crescător din vector. Dacă există mai multe astfel de secvențe se va determina cea mai din stânga.


Date de intrare

Fișierul de intrare secvcresc.in conține numărul n și n valori naturale, reprezentând elementele vectorului. Valorile din fișier pot fi dispuse pe mai multe linii.

Date de ieșire

Fișierul de ieșire secvcresc.out va conține pe prima linie numerele st și dr, reprezentând indicii de început și de sfârșit ai secvenței determinate.

Restricţii şi precizări

  • 0 < n ≤ 10.000
  • elementele vectorului vor fi mai mici decât 1.000.000 și sunt numerotate de la 1

Exemplu

Intrare
9
2 6 4 5 8 9 6 3 4
Ieșire
3 6

Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 0181 - SecvCresc

with open("secvcresc.in") as fin:

   n = int(fin.readline())
   v = []
   for _ in range(n):
       v += list(map(int, fin.readline().split()))

max_start, max_end = 0, 0 # indicii de început și sfârșit ai secvenței maximale cur_start, cur_end = 0, 0 # indicii de început și sfârșit ai secvenței crescătoare curente max_len = 1 # lungimea maximă a secvenței crescătoare cur_len = 1 # lungimea secvenței crescătoare curente

for i in range(1, n):

   if v[i] > v[i - 1]:
       cur_len += 1
       cur_end = i
       if cur_len > max_len:
           max_start = cur_start
           max_end = cur_end
           max_len = cur_len
   else:
       cur_start = i
       cur_end = i
       cur_len = 1

with open("secvcresc.out", "w") as fout:

   fout.write(f"{max_start + 1} {max_end + 1}\n")  # adăugăm 1 la indici pentru a fi 1-indexați



</syntaxhighlight>