0134 - SecvK: Difference between revisions
No edit summary |
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."''' | '''"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 | ||
: 6 6 4 | : 6 6 4 | ||
== Exemplu 2 == | == Exemplu 2 == | ||
; Intrare | ; Intrare | ||
: secvk.in | : secvk.in | ||
: 8 3 | : 8 3 | ||
: | : 52748 | ||
; Ieșire | ; Ieșire | ||
: Datele nu corespund restricțiilor impuse. | : Datele nu corespund restricțiilor impuse. | ||
== Rezolvare == | == Rezolvare == | ||
Line 41: | Line 41: | ||
# 0134 - SecvK | # 0134 - SecvK | ||
def | def validate_input(n, k, arr): | ||
n | 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): | for i in range(k, n): | ||
start += 1 | |||
start + | end += 1 | ||
if | current_sum = sum(arr[start:end+1]) | ||
if current_sum > max_sum: | |||
return | 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> | </syntaxhighlight> | ||
== Explicatie Rezolvare == | == 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. |
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>
- 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.