0134 - SecvK: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
 
(3 intermediate revisions by 2 users not shown)
Line 11: Line 11:
== Date de ieșire ==  
== Date de ieșire ==  
Dacă datele sunt introduse corect, pe ecran se va afișa:  
Dacă datele sunt introduse corect, pe ecran se va afișa:  
'''"Datele sunt introduse corect."''', apoi pe un rând nou ''' 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."'''.
'''"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 ==
Line 23: Line 23:
: 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
: secvk.out
: Datele nu corespund restricțiilor impuse.
: 6 6 4
: 6 6 4
== Exemplu 2 ==
== Exemplu 2 ==
; Intrare
; Intrare
: secvk.in
: secvk.in
: 8 3
: 8 3
: 5 6 1 2 6 6 4 3
: 52748
; Ieșire
; Ieșire
: secvk.out
: Datele nu corespund restricțiilor impuse.
: Datele nu corespund restricțiilor impuse.
: 2 3 4
 


== Rezolvare ==  
== Rezolvare ==  
Line 41: Line 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):
     sir = list(map(int, input().split()))
        return False
     return n, k, sir
    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]


def rezolvare(n, k, sir):
    if k > n:
        return None  # Daca k > n, secventa de lungime k nu poate fi formata
    start = 0  # Primul index al secventei curente
    suma_curenta = sum(sir[:k])  # Suma elementelor primei secvente
    suma_maxima = suma_curenta  # Suma maxima gasita pana acum
     for i in range(k, n):
     for i in range(k, n):
         suma_curenta += sir[i] - sir[start]  # Adaugam un nou element si eliminam cel mai vechi
         start += 1
         start += 1 # Mutam indexul de inceput al secventei curente
        end += 1
         if suma_curenta > suma_maxima:
         current_sum = sum(arr[start:end+1])
             suma_maxima = suma_curenta
         if current_sum > max_sum:
     return suma_maxima
             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()))


def afisare(suma_maxima):
     message, result = find_max_sequence(n, k, arr)
    if suma_maxima is None:
        print("Datele nu corespund restricțiilor impuse.")
     else:
        print("Datele sunt introduse corect.")
        print(suma_maxima)


if __name__ == '__main__':
     print(message)
     # Teste
     if message == "Datele sunt introduse corect.":
    n, k, sir = citire()
        with open("secvk.out", "w") as f:
     suma_maxima = rezolvare(n, k, sir)
            f.write(" ".join(str(x) for x in result)))
    afisare(suma_maxima)




</syntaxhighlight>
</syntaxhighlight>
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==
Funcția citire() primește datele de intrare de la tastatură și returnează cele trei variabile n, k și sir.
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 rezolvare(n, k, sir) primește cele trei variabile și calculează suma maximă pentru o secvență de lungime k. Mai întâi verificăm dacă k este mai mare decât n. Dacă da, atunci secvența de lungime k nu poate fi formată, deci returnăm None. Altfel, calculăm suma primelor k elemente și o setăm ca fiind suma maximă găsită până acum. Apoi, parcurgem lista sir de la indexul k până la n-1. La fiecare iterație adăugăm un nou element la secvență și eliminăm cel mai vechi element. Indexul de început al secvenței curente este mutat la dreapta, astfel încât secvența să aibă lungimea k. Dacă suma curentă este mai mare decât suma maximă găsită până acum, o actualizăm. La final, returnăm suma maximă găsită.
 
Funcția afisare(suma_maxima) primește suma maximă și afișează un mesaj corespunzător, în funcție de faptul că datele de intrare sunt corecte sau nu. Dacă sunt corecte, atunci afișează suma maximă găsită. Dacă nu sunt corecte, atunci afișează un mesaj de eroare.
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.

Latest revision as of 20:29, 14 May 2023

Sursa: 0134 - SecvK


Cerinţa[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

  • 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[edit | edit source]

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[edit | edit source]

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


Rezolvare[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<syntaxhighlight lang="python" line>

  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)))


</syntaxhighlight>

Explicatie Rezolvare[edit | edit source]

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.