0181 - SecvCresc
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>
- 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>