0181 - SecvCresc: Diferență între versiuni

De la Universitas MediaWiki
(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...)
 
Fără descriere a modificării
Linia 26: Linia 26:
# 0181 - SecvCresc
# 0181 - SecvCresc


with open("secvcresc.in") as fin:
def citire():
    n = int(fin.readline())
    with open("secvcresc.in", "r") as f:
    v = []
        n = int(f.readline())
    for _ in range(n):
        v = []
        v += list(map(int, fin.readline().split()))
        for line in f:
            v += list(map(int, line.split()))
    return n, v


max_start, max_end = 0, 0  # indicii de început și sfârșit ai secvenței maximale
def rezolvare(n, v):
cur_start, cur_end = 0, 0  # indicii de început și sfârșit ai secvenței crescătoare curente
    max_length = 1
max_len = 1 # lungimea maximă a secvenței crescătoare
    max_start = max_end = start = end = 0
cur_len = 1 # lungimea secvenței crescătoare curente
    length = 1
    for i in range(1, n):
        if v[i] > v[i - 1]:
            length += 1
            end = i
        else:
            if length > max_length:
                max_length = length
                max_start, max_end = start, end
            length = 1
            start = end = i
    if length > max_length:
        max_length = length
        max_start, max_end = start, end
    return max_start + 1, max_end + 1


for i in range(1, n):
def validare(n, v, start, end):
    if v[i] > v[i - 1]:
    for i in range(start - 1, end - 1):
        cur_len += 1
        if v[i] >= v[i + 1]:
        cur_end = i
            return False
        if cur_len > max_len:
    return True
            max_start = cur_start
 
            max_end = cur_end
if __name__ == "__main__":
            max_len = cur_len
    n, v = citire()
    start, end = rezolvare(n, v)
    with open("secvcresc.out", "w") as f:
        f.write(f"{start} {end}\n")
    if validare(n, v, start, end):
        print("Rezultat corect!")
     else:
     else:
         cur_start = i
         print("Rezultat incorect!")
        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>
</syntaxhighlight>
== Explicatie Rezolvare ==
Pentru a rezolva această problemă, putem parcurge vectorul și ține în variabila lungime lungimea secvenței curente. De asemenea, putem ține și variabilele start și end care reprezintă indicele de început și sfârșit al secvenței curente. Dacă găsim o valoare mai mare decât precedenta, atunci lungimea secvenței crește și actualizăm end cu indicele curent. Dacă găsim o valoare mai mică sau egală cu precedenta, atunci secvența curentă se termină și verificăm dacă este mai lungă decât cea maximă găsită până acum. Dacă da, actualizăm variabilele max_start, max_end și max_length

Versiunea de la data 17 aprilie 2023 20:04

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

# 0181 - SecvCresc

def citire():
    with open("secvcresc.in", "r") as f:
        n = int(f.readline())
        v = []
        for line in f:
            v += list(map(int, line.split()))
    return n, v

def rezolvare(n, v):
    max_length = 1
    max_start = max_end = start = end = 0
    length = 1
    for i in range(1, n):
        if v[i] > v[i - 1]:
            length += 1
            end = i
        else:
            if length > max_length:
                max_length = length
                max_start, max_end = start, end
            length = 1
            start = end = i
    if length > max_length:
        max_length = length
        max_start, max_end = start, end
    return max_start + 1, max_end + 1

def validare(n, v, start, end):
    for i in range(start - 1, end - 1):
        if v[i] >= v[i + 1]:
            return False
    return True

if __name__ == "__main__":
    n, v = citire()
    start, end = rezolvare(n, v)
    with open("secvcresc.out", "w") as f:
        f.write(f"{start} {end}\n")
    if validare(n, v, start, end):
        print("Rezultat corect!")
    else:
        print("Rezultat incorect!")

Explicatie Rezolvare

Pentru a rezolva această problemă, putem parcurge vectorul și ține în variabila lungime lungimea secvenței curente. De asemenea, putem ține și variabilele start și end care reprezintă indicele de început și sfârșit al secvenței curente. Dacă găsim o valoare mai mare decât precedenta, atunci lungimea secvenței crește și actualizăm end cu indicele curent. Dacă găsim o valoare mai mică sau egală cu precedenta, atunci secvența curentă se termină și verificăm dacă este mai lungă decât cea maximă găsită până acum. Dacă da, actualizăm variabilele max_start, max_end și max_length