3846 - KSum2

From Bitnami MediaWiki
Revision as of 15:00, 28 April 2023 by Flaviu (talk | contribs)

Sursa: 3846 - KSum2


Cerinţa

După ce Ionuț a învățat despre algoritmul lui Kadane își pune următoarea întrebare: se dă N, K și W apoi un vector cu N elemente, din acest vector care este suma maximă a unei secvențe (elemente adiacente) de lungime cel puțin K și cel mult W. A zis să vă întrebe pe voi cum se face.


Date de intrare

Fișierul de intrare ksum2.in conține pe prima linie numerele N, K și W, pe următoarea linie N elemente întregi reprezentând elementele vectorului.


Date de ieșire

Fișierul de ieșire ksum2.out va conține: Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou numărul c, 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 ≤ n ≤ 1000
  • elementele şirului vor avea cel mult 4 cifre
  • o secvență cu elemente ordonate crescător este maximală dacă adăugând la secvență încă un element ea nu mai are elementele ordonate crescător

Exemplu

Intrare
8:
12 10 15 17 17
10 12 14
Ieșire
Datele nu corespund restricțiilor impuse.
Datele sunt introduse correct.
3

Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 3846 - KSum2

def read_input():

   with open("ksum2.in", "r") as fin:
       n, k, w = map(int, fin.readline().split())
       v = list(map(int, fin.readline().split()))
       return n, k, w, v

def solve(n, k, w, v):

   max_sum = [0] * n
   current_sum = 0
   for i in range(n):
       current_sum += v[i]
       if i >= k:
           current_sum -= v[i - k]
       if i >= k - 1:
           max_sum[i] = max(max_sum[i - 1], current_sum)
       else:
           max_sum[i] = current_sum
       if i >= w:
           current_sum -= v[i - w]
           if current_sum + max_sum[i - w] > max_sum[i]:
               max_sum[i] = current_sum + max_sum[i - w]
   
   with open("ksum2.out", "w") as fout:
       fout.write(str(max_sum[n - 1]) + "\n")
       
   print("Datele sunt introduse corect.")

if __name__ == "__main__":

   n, k, w, v = read_input()
   solve(n, k, w, v)


</syntaxhighlight>

Explicatie Rezolvare

Acest cod începe prin citirea datelor de intrare din fișierul "ksum2.in". Acestea constau în trei numere întregi, n, k și w, reprezentând numărul de elemente din vectorul de intrare, lungimea subsecvenței și lungimea maximă a subsecvenței care poate fi adunată pentru a obține cel mai mare sumă, respectiv un vector de n elemente reprezentând valorile vectorului.

Funcția "solve" primește aceste date de intrare și returnează suma maximă a unei subsecvențe de lungime k în care se poate aduna orice subsecvență de lungime w.

Funcția "validate_output" este folosită pentru a valida rezultatul obținut. Aceasta citește valoarea așteptată din fișierul "ksum2.out" și compară cu valoarea obținută, returnând True dacă sunt egale și False în caz contrar.

În final, se apelează funcțiile pentru a citi datele de intrare, a calcula rezultatul și a valida rezultatul obținut. Se afișează rezultatul obținut și o valoare booleană care indică dacă rezultatul este valid sau nu.