0134 - SecvK: Diferență între versiuni

De la Universitas MediaWiki
Fără descriere a modificării
Fără descriere a modificării
 
(Nu s-au afișat 5 versiuni intermediare efectuate de alți 2 utilizatori)
Linia 10: Linia 10:


== Date de ieșire ==  
== Date de ieșire ==  
Fişierul de ieşire secvk.out va conţine pe prima linie k numere, reprezentând elementele secvenței cerute.
Dacă datele sunt introduse corect, pe ecran se va afișa:
'''"Datele sunt introduse corect."'''și fișierul secvk.out va conţine pe prima linie k numere, reprezentând elementele secvenței cerute''', reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: '''"Datele nu corespund restricțiilor impuse."'''.


== Restricţii şi precizări ==
== Restricţii şi precizări ==
Linia 16: Linia 17:
* numerele de pe a doua linie a fişierului de intrare vor fi mai mici decât 1000
* numerele de pe a doua linie a fişierului de intrare vor fi mai mici decât 1000
* dacă există mai multe secvențe de lungime k cu suma maximă se va afișa prima
* dacă există mai multe secvențe de lungime k cu suma maximă se va afișa prima
== Exemplu ==
== Exemplu 1 ==
; Intrare
; Intrare
: secvk.in
: 8 3
: 8 3
: 5 6 1 2 6 6 4 3
: 5 6 1 2 6 6 4 3
; Ieșire
; Ieșire
: Datele sunt introduse correct
: secvk.out
: 6 6 4
: 6 6 4
== Exemplu 2 ==
; Intrare
: secvk.in
: 8 3
: 52748
; Ieșire
: Datele nu corespund restricțiilor impuse.




Linia 29: Linia 41:
# 0134 - SecvK
# 0134 - SecvK


def citire():
def validate_input(n, k, arr):
     n, k = map(int, input().split())
     if k > n or n > 100000 or k < 1 or n < 1 or any(x >= 1000 for x in arr):
    lst = list(map(int, input().split()))
        return False
     return n, k, lst
     return True


def secventa_maxima(n, k, lst):
    suma_maxima = 0
    secventa_maxima = []
    for i in range(n-k+1):
        suma = sum(lst[i:i+k])
        if suma > suma_maxima:
            suma_maxima = suma
            secventa_maxima = lst[i:i+k]
    return secventa_maxima


def validare(n, k, lst, secventa):
def find_max_sequence(n, k, arr):
     assert len(secventa) == k, "Lungimea secventei nu este k"
     if not validate_input(n, k, arr):
     assert sum(secventa) == max(sum(lst[i:i+k]) for i in range(n-k+1)), "Suma secventei nu este maxima"
        return "Datele nu corespund restricțiilor impuse.", []
    for x in secventa:
 
        assert x in lst, "Elementul {} nu se afla in lista initiala".format(x)
     start = 0
    end = k-1
    max_sum = sum(arr[start:end+1])
    result = arr[start:end+1]
 
    for i in range(k, n):
        start += 1
        end += 1
        current_sum = sum(arr[start:end+1])
        if current_sum > max_sum:
            max_sum = current_sum
            result = arr[start:end+1]
 
    return "Datele sunt introduse corect.", result
 


if __name__ == "__main__":
if __name__ == "__main__":
     n, k, lst = citire()
     with open("secvk.in", "r") as f:
    secventa = secventa_maxima(n, k, lst)
        n, k = map(int, f.readline().strip().split())
    validare(n, k, lst, secventa)
        arr = list(map(int, f.readline().strip().split()))
    print(*secventa)


    message, result = find_max_sequence(n, k, arr)
    print(message)
    if message == "Datele sunt introduse corect.":
        with open("secvk.out", "w") as f:
            f.write(" ".join(str(x) for x in result)))




</syntaxhighlight>
</syntaxhighlight>
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==
Funcția citire citește datele de intrare și le returnează sub forma unei tuple (n, k, lst).
validate_input(n, k, arr) - această funcție primește trei argumente: n și k, reprezentând numărul total de elemente din listă, respectiv numărul de elemente consecutive din listă pe care trebuie să le adunăm, și arr, o listă de numere întregi. Funcția verifică dacă toate aceste valori respectă restricțiile impuse: 1 ≤ k ≤ n ≤ 100.000, iar toate numerele din listă sunt mai mici decât 1000. În cazul în care aceste condiții nu sunt respectate, funcția returnează False, altfel returnează True.
Funcția secventa_maxima calculează secvența de lungime k cu suma maximă din lista lst, utilizând o buclă for și metoda sum. Variabilele suma_maxima și secventa_maxima memorează suma și secvența maximă întâlnită până acum.
 
Funcția validare verifică corectitudinea secvenței calculate de secventa_maxima în raport cu datele de intrare. Funcția verifică lungimea secvenței, suma elementelor și faptul că fiecare element se află în lista inițială. Dacă validarea eșuează, funcția generează o excepție cu un mesaj corespunzător.
find_max_sequence(n, k, arr) - această funcție primește aceiași trei argumente ca și funcția de mai sus, și calculează suma maximă a unei secvențe de k elemente consecutive din lista arr. Pentru a face acest lucru, funcția folosește o metodă de tip sliding window, parcurgând lista arr și determinând suma maximă a unei ferestre glisante de lungime k. Dacă argumentele nu respectă restricțiile impuse, funcția returnează un mesaj de eroare și o listă vidă, altfel returnează un mesaj de succes și lista de k elemente consecutive care au suma maximă.
În if __name__ == "__main__", apelăm funcțiile citire, secventa_maxima și validare, și apoi afișăm secvența maximă utilizând print(*secventa) (acest lucru afișează elementele secvenței separate prin spații, fără paranteze sau alte simboluri).
 
main() - această funcție deschide fișierul secvk.in, citind valorile n, k și lista arr. Apoi, apelează funcția find_max_sequence() cu aceste argumente și afișează mesajul de eroare sau lista de elemente dacă acestea sunt valabile. În cazul în care lista de elemente este validă, scrie rezultatul în fișierul secvk.out.

Versiunea curentă din 14 mai 2023 20:29

Sursa: 0134 - SecvK


Cerinţa

Se dă un șir cu n numere naturale și un număr k. Să se determine o secvență de elemente de lungime k cu suma elementelor maximă.


Date de intrare

Fişierul de intrare secvk.in conţine pe prima linie numerele n și k, iar pe a doua linie n numere naturale separate prin spaţii.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect."și fișierul secvk.out va conţine pe prima linie k numere, reprezentând elementele secvenței cerute, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • 1 ≤ k ≤ n ≤ 100.000
  • numerele de pe a doua linie a fişierului de intrare vor fi mai mici decât 1000
  • dacă există mai multe secvențe de lungime k cu suma maximă se va afișa prima

Exemplu 1

Intrare
secvk.in
8 3
5 6 1 2 6 6 4 3
Ieșire
Datele sunt introduse correct
secvk.out
6 6 4

Exemplu 2

Intrare
secvk.in
8 3
52748
Ieșire
Datele nu corespund restricțiilor impuse.


Rezolvare

Rezolvare ver. 1

# 0134 - SecvK

def validate_input(n, k, arr):
    if k > n or n > 100000 or k < 1 or n < 1 or any(x >= 1000 for x in arr):
        return False
    return True


def find_max_sequence(n, k, arr):
    if not validate_input(n, k, arr):
        return "Datele nu corespund restricțiilor impuse.", []

    start = 0
    end = k-1
    max_sum = sum(arr[start:end+1])
    result = arr[start:end+1]

    for i in range(k, n):
        start += 1
        end += 1
        current_sum = sum(arr[start:end+1])
        if current_sum > max_sum:
            max_sum = current_sum
            result = arr[start:end+1]

    return "Datele sunt introduse corect.", result


if __name__ == "__main__":
    with open("secvk.in", "r") as f:
        n, k = map(int, f.readline().strip().split())
        arr = list(map(int, f.readline().strip().split()))

    message, result = find_max_sequence(n, k, arr)

    print(message)
    if message == "Datele sunt introduse corect.":
        with open("secvk.out", "w") as f:
            f.write(" ".join(str(x) for x in result)))

Explicatie Rezolvare

validate_input(n, k, arr) - această funcție primește trei argumente: n și k, reprezentând numărul total de elemente din listă, respectiv numărul de elemente consecutive din listă pe care trebuie să le adunăm, și arr, o listă de numere întregi. Funcția verifică dacă toate aceste valori respectă restricțiile impuse: 1 ≤ k ≤ n ≤ 100.000, iar toate numerele din listă sunt mai mici decât 1000. În cazul în care aceste condiții nu sunt respectate, funcția returnează False, altfel returnează True.

find_max_sequence(n, k, arr) - această funcție primește aceiași trei argumente ca și funcția de mai sus, și calculează suma maximă a unei secvențe de k elemente consecutive din lista arr. Pentru a face acest lucru, funcția folosește o metodă de tip sliding window, parcurgând lista arr și determinând suma maximă a unei ferestre glisante de lungime k. Dacă argumentele nu respectă restricțiile impuse, funcția returnează un mesaj de eroare și o listă vidă, altfel returnează un mesaj de succes și lista de k elemente consecutive care au suma maximă.

main() - această funcție deschide fișierul secvk.in, citind valorile n, k și lista arr. Apoi, apelează funcția find_max_sequence() cu aceste argumente și afișează mesajul de eroare sau lista de elemente dacă acestea sunt valabile. În cazul în care lista de elemente este validă, scrie rezultatul în fișierul secvk.out.