3652 - secvcost

From Bitnami MediaWiki
Revision as of 15:15, 3 January 2024 by Zmicala Narcis (talk | contribs) (Pagină nouă: Se dă un șir '''V''' de '''N''' numere naturale distincte. O secvență '''[X, Y]''' este formată din toate pozițiile consecutive dintre '''X''' și '''Y''' din șir. Se definește costul unei poziții '''P''' ca fiind valoarea din șir de pe poziția '''P''' înmulțită cu lungimea maximă a unei secvențe care conține poziția '''P''' și a cărei valoare maximă se află tot pe poziția '''P'''. == Cerința == Se dau '''M''' întrebări de forma: '''X Y''' – să se...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Se dă un șir V de N numere naturale distincte. O secvență [X, Y] este formată din toate pozițiile consecutive dintre X și Y din șir. Se definește costul unei poziții P ca fiind valoarea din șir de pe poziția P înmulțită cu lungimea maximă a unei secvențe care conține poziția P și a cărei valoare maximă se află tot pe poziția P.

Cerința[edit | edit source]

Se dau M întrebări de forma: X Y – să se calculeze suma tuturor costurilor pozițiilor din secvența [X, Y]. Atenție! Când se calculează costul unei poziții P din [X, Y], secvența de lungime maximă pe care valoarea V[P] este maximă se calculează în funcție de tot șirul, NU în funcție de secvența [X, Y] (pentru clarificare urmăriți exemplul).

Date de intrare[edit | edit source]

Fișierul de intrare secvcostin.txt conține pe prima linie cele două numere N și M, separate prin spațiu. Pe a doua linie se află N numere naturale distincte reprezentând elementele șirului V. Pe următoarele M linii se află perechi de valori X, Y reprezentând întrebările la care trebuie să se răspundă.

Date de ieșire[edit | edit source]

Fișierul de ieșire secvcostout.txt va conține M linii cu câte un număr pe fiecare linie reprezentând răspunsul la cele M întrebări, în ordine.

Restricții și precizări[edit | edit source]

  • Toate valorile din șir sunt mai mici sau egale decât 5.000.000
  • Pentru 25% din teste N, M ≤ 500
  • Pentru alte 25% din teste N, M ≤ 10.000
  • Pentru restul de 50% din teste N, M ≤ 200.000

Exemplul 1[edit | edit source]

secvcostin.txt
5 2
2 3 1 5 4
3 3
2 2
secvcostout.txt
Datele introduse corespund restricțiilor impuse.
1
9

Explicație[edit | edit source]

Pentru prima întrebare avem V[3] = 1 care este maxim pe secvența [3, 3]. Costul este 1 * 1 = 1. Pentru a doua întrebare avem V[2] = 3 care este maxim pe secvența [1, 3]. Costul este 3 * 3 = 9.

Exemplul 2[edit | edit source]

secvcostin.txt
5 3
2 3 1 5 4
1 3
5 5
4 4
secvcostout.txt
Datele introduse corespund restricțiilor impuse.
12
4
25

Explicație[edit | edit source]

2*1 + 3*3 + 1*1 = 12 4*1 = 4 5*5 = 25

Exemplul 3[edit | edit source]

secvcostin.txt
10 10
10 30 29 39 34 32 3 6 7 9
6 7
1 7
6 10
1 5
7 9
4 7
3 7
5 6
3 7
6 10
secvcostout.txt
Datele introduse corespund restricțiilor impuse.
163
886
232
723
36
757
786
364
786
232

Exemplul 4[edit | edit source]

secvcostin.txt
5 2
2 3 1 5 6000000
3 3
2 2
secvcostout.txt
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 3652 - secvcost

def validare(date1): # functia de validare a datelor de intrare

   numar_elemente, numar_intrebari = map(int, date1[0].split())
   if not (1 <= numar_elemente <= 200000) or not (1 <= numar_intrebari <= 200000):
       raise ValueError
   sir = list(map(int, date1[1].split()))
   if len(sir) != numar_elemente or any(element > 5000000 for element in sir):
       raise ValueError
   intrebari = [list(map(int, date1[i].split())) for i in range(2, 2 + numar_intrebari)]
   if any(not (1 <= X <= Y <= numar_elemente) for X, Y in intrebari):
       raise ValueError
   fisier_iesire.write("Datele de intrare corespund restrictiilor impuse\n")


def cost_secventa(date1): # functia de rezolvare

   numar_elemente, numar_intrebari = map(int, date1[0].split())
   sir = list(map(int, date1[1].split()))
   intrebari = [list(map(int, date1[i].split())) for i in range(2, 2 + numar_intrebari)]
   for X, Y in intrebari:
       cost = sum([sir[i] * max(len(sir[:i+1]), len(sir[i:])) for i in range(X-1, Y)])
       fisier_iesire.write(f"{cost}\n")


if __name__ == '__main__':

   fisier_intrare = open("secvcostin.txt", "r")         # declararea fisierelor
   fisier_iesire = open("secvcostout.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)
   # din cauza datelor de intrare pot aparea 2 tipuri de erori, valueError sau IndexError pe care le tratam
   try:
       date = fisier_intrare.readlines()      # citirea numerelor se face ca sir de caractere
       validare(date)                 # apelul functiei de validare
       cost_secventa(date)               # apelul functiei de rezolvare
   except ValueError:
       fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>