1763 - Pachete2: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Enunt == Se consideră un șir de N numere ce reprezintă cantitățile disponibile de produse de sezon de N tipuri, în ordinea în care acestea sunt aduse de la magazie. Un automat poate realiza pachete cu două dintre tipurile de produse venite una imediat după cealaltă de la magazie. El este programat să pună în fiecare pachet un același număr A de produse de un tip și un același număr B de produse de celălalt tip, astfel încât să nu rămână produse n...
 
No edit summary
Tag: visualeditor
 
Line 1: Line 1:
== Enunt ==  
== Enunt ==  


Se consideră un șir de N numere ce reprezintă cantitățile disponibile de produse de sezon de N tipuri, în ordinea în care acestea sunt aduse de la magazie. Un automat poate realiza pachete cu două dintre tipurile de produse venite una imediat după cealaltă de la magazie. El este programat să pună în fiecare pachet un același număr A de produse de un tip și un același număr B de produse de celălalt tip, astfel încât să nu rămână produse necuprinse în pachete.
Se consideră un șir de <code>N</code> numere ce reprezintă cantitățile disponibile de produse de sezon de <code>N</code> tipuri, în ordinea în care acestea sunt aduse de la magazie. Un automat poate realiza pachete cu două dintre tipurile de produse venite una imediat după cealaltă de la magazie. El este programat să pună în fiecare pachet un același număr <code>A</code> de produse de un tip și un același număr <code>B</code> de produse de celălalt tip, astfel încât să nu rămână produse necuprinse în pachete.
De exemplu, dacă există 20 de prăjiturele COCO și 15 cutii de suc JUMBO, atunci automatul va fi programat să pună 4 prăjiturele și 3 sucuri în fiecare pachet, epuizând simultan stocul de prăjiturele și cutii de suc și obținând astfel 5 pachete. Pentru alte două tipuri de produse consecutive se va proceda la fel, schimbându-se doar parametrii A și B ale programului de împachetare.
La unele produse din șir se poate renunța în totalitate, nefiind incluse în niciun pachet.


== Cerinta ==
De exemplu, dacă există <code>20</code> de prăjiturele COCO și <code>15</code> cutii de suc JUMBO, atunci automatul va fi programat să pună <code>4</code> prăjiturele și <code>3</code> sucuri în fiecare pachet, epuizând simultan stocul de prăjiturele și cutii de suc și obținând astfel <code>5</code> pachete. Pentru alte două tipuri de produse consecutive se va proceda la fel, schimbându-se doar parametrii <code>A</code> și <code>B</code> ale programului de împachetare.


Cunoscându-se numărul N de tipuri de produse și cantitățile din fiecare produs, în ordinea în care sosesc de la magazie, să se stabilească numărul maxim de pachete care se pot obține prin alegerea convenabilă a perechilor de produse consecutive și programarea corespunzătoare a automatului, pentru fiecare pereche aleasă.
La unele produse din șir se poate renunța în totalitate, nefiind incluse în niciun pachet.


== Date de intrare ==
= Cerința =
Cunoscându-se numărul <code>N</code> de tipuri de produse și cantitățile din fiecare produs, în ordinea în care sosesc de la magazie, să se stabilească numărul maxim de pachete care se pot obține prin alegerea convenabilă a perechilor de produse consecutive și programarea corespunzătoare a automatului, pentru fiecare pereche aleasă.


Din fișierul pachete2.in se citesc, de pe prima linie numărul N de tipuri de produse, iar de pe linia a doua, N numere naturale reprezentând stocurile de produse de fiecare tip, în ordinea în care vin acestea de la magazie. Numerele sunt despărțite între ele prin spații.
= Date de intrare =
Din fișierul <code>pachete2.in</code> se citesc, de pe prima linie numărul <code>N</code> de tipuri de produse, iar de pe linia a doua, <code>N</code> numere naturale reprezentând stocurile de produse de fiecare tip, în ordinea în care vin acestea de la magazie. Numerele sunt despărțite între ele prin spații.


== Date de ieșire ==
= Date de ieșire =
În fișierul <code>pachete2.out</code> se afișează valoarea <code>P</code> reprezentând numărul maxim de pachete care se pot forma. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".


În fișierul pachete2.out se afișează valoarea P reprezentând numărul maxim de pachete care se pot forma.
= Restricții și precizări =


== Restricții și precizări ==
* <code>1≤N≤100000</code>
* Numărul de produse disponibile din fiecare tip este un număr natural nenul cu cel mult <code>6</code> cifre.
* Din orice produs din șir, mașina de împachetat poate fi programată să pună în fiecare pachet cel puțin unul și cel mult toate produsele disponibile.
* Numărul maxim de pachete obținut este cel mult <code>2000000000</code>.
* După ultimul număr din fișier se pot afla unul sau mai multe spații.


*1≤N≤100000
= Exemplul 1: =
*Numărul de produse disponibile din fiecare tip este un număr natural nenul cu cel mult 6 cifre.
<code>pachete2IN.txt</code>
*Din orice produs din șir, mașina de împachetat poate fi programată să pună în fiecare pachet cel puțin unul și cel mult toate produsele disponibile.
5
*Numărul maxim de pachete obținut este cel mult 2000000000.
20 15 18 12 13
*După ultimul număr din fișier se pot afla unul sau mai multe spații.


== Exemplul 1 ==
6
18 9 5 14 63 2
<code>pachete2OUT.txt</code>
11


;pachete2in.txt
16


:5
=== Explicație ===
{| class="wikitable"
|Se fac <code>5</code> pachete cu primele două tipuri de produse (punând <code>4</code> și respectiv <code>3</code> din fiecare) și se fac <code>6</code> pachete cu următoarele două tipuri de produse (punând <code>3</code> și respectiv <code>2</code> din fiecare). Ultimul produs rămâne nefolosit.
|}
{| class="wikitable"
|Se fac <code>9</code> pachete cu primele două produse (punând <code>2</code> și respectiv <code>1</code> din fiecare), nu se folosește produsul al treilea, se fac <code>7</code> pachete cu al patrulea și al cincilea produs (punând <code>2</code> și respectiv <code>9</code> din fiecare). Ultimul produs rămâne nefolosit.
|}


:20 15 18 12 13
== Exemplul 2: ==
<code>pachete2IN.txt</code>
1000001
20 15 18 12 13


:6
6
18 9 5 14 63 2
<code>pachete2OUT.txt</code>
Datele nu corespund restrictiilor impuse


:18 9 5 14 63 2
== Rezolvare ==


;pachete2out.txt
<syntaxhighlight lang="python3" line="1">
 
def cmmdc(a, b):
:Datele introduse corespund restrictiilor impuse.
    while b:
 
        a, b = b, a % b
:11
    return a
 
:16


== Exemplul 2 ==
def check_constraints(num_sets, x_values):
    # Constraint 1: 1 ≤ N ≤ 100000
    if not (1 <= num_sets <= 100000):
        return False


;pachetein.txt
    # Constraint 2: Numărul de produse disponibile din fiecare tip este un număr natural nenul cu cel mult 6 cifre.
    for x_list in x_values:
        for x in x_list:
            if not (1 <= x <= 999999):
                return False


:-8
    return True


:0 43 84 83 54
def handle_constraints_error(g):
 
    g.write("Datele nu corespund restrictiilor impuse\n")
:-2
 
:12 32 -3 -6 -5 99
 
;pacheteout.txt
 
:Datele de intrare nu corespund restrictiilor impuse.
 
== Rezolvare ==
 
<syntaxhighlight lang="python3" line="1">


def numar_maxim_pachete(N, cantitati):
def main():
    numar_pachete_maxim = 0
    try:
        with open("pachete2IN.txt", "r") as f, open("pachete2OUT.txt", "w") as g:
            num_sets = int(f.readline())
            x_values_list = []
            for _ in range(num_sets):
                x_values = list(map(int, f.readline().split()))
                x_values_list.append(x_values)


    for i in range(N - 1):
            if not check_constraints(len(x_values_list), x_values_list):
        produs1 = cantitati[i]
                handle_constraints_error(g)
        produs2 = cantitati[i + 1]
                return  # Exit program if constraints are violated


        # Calculăm numărul maxim de pachete pentru perechea curentă
            for x_values in x_values_list:
        pachete_pereche = min(produs1 // 2, produs2 // 2)
                n = len(x_values)
        numar_pachete_maxim += pachete_pereche
                c = [0] * (n + 1)
                m = [0] * (n + 1)
                if n >= 2:
                    x = x_values[0]
                    for i in range(1, n):
                        y = x_values[i]
                        c[i] = cmmdc(x, y)
                        x = y


        # Actualizăm cantitățile de produse
                    m[1] = 0
        cantitati[i] -= pachete_pereche * 2
                    m[2] = c[1]
        cantitati[i + 1] -= pachete_pereche * 2


    return numar_pachete_maxim
                    for i in range(3, n + 1):
                        m[i] = max(m[i - 1], m[i - 2] + c[i - 1])


print(f"Numărul maxim de pachete: {rezultat}")
                    result = str(m[n]) if m[n] != 0 else ""
                    g.write(result + '\n')
    except FileNotFoundError:
        print("Input file 'pachete2IN.txt' not found.")
    except Exception as e:
        print("An error occurred:", e)


if __name__ == "__main__":
    main()


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 20:05, 22 March 2024

Enunt[edit]

Se consideră un șir de N numere ce reprezintă cantitățile disponibile de produse de sezon de N tipuri, în ordinea în care acestea sunt aduse de la magazie. Un automat poate realiza pachete cu două dintre tipurile de produse venite una imediat după cealaltă de la magazie. El este programat să pună în fiecare pachet un același număr A de produse de un tip și un același număr B de produse de celălalt tip, astfel încât să nu rămână produse necuprinse în pachete.

De exemplu, dacă există 20 de prăjiturele COCO și 15 cutii de suc JUMBO, atunci automatul va fi programat să pună 4 prăjiturele și 3 sucuri în fiecare pachet, epuizând simultan stocul de prăjiturele și cutii de suc și obținând astfel 5 pachete. Pentru alte două tipuri de produse consecutive se va proceda la fel, schimbându-se doar parametrii A și B ale programului de împachetare.

La unele produse din șir se poate renunța în totalitate, nefiind incluse în niciun pachet.

Cerința[edit]

Cunoscându-se numărul N de tipuri de produse și cantitățile din fiecare produs, în ordinea în care sosesc de la magazie, să se stabilească numărul maxim de pachete care se pot obține prin alegerea convenabilă a perechilor de produse consecutive și programarea corespunzătoare a automatului, pentru fiecare pereche aleasă.

Date de intrare[edit]

Din fișierul pachete2.in se citesc, de pe prima linie numărul N de tipuri de produse, iar de pe linia a doua, N numere naturale reprezentând stocurile de produse de fiecare tip, în ordinea în care vin acestea de la magazie. Numerele sunt despărțite între ele prin spații.

Date de ieșire[edit]

În fișierul pachete2.out se afișează valoarea P reprezentând numărul maxim de pachete care se pot forma. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

Restricții și precizări[edit]

  • 1≤N≤100000
  • Numărul de produse disponibile din fiecare tip este un număr natural nenul cu cel mult 6 cifre.
  • Din orice produs din șir, mașina de împachetat poate fi programată să pună în fiecare pachet cel puțin unul și cel mult toate produsele disponibile.
  • Numărul maxim de pachete obținut este cel mult 2000000000.
  • După ultimul număr din fișier se pot afla unul sau mai multe spații.

Exemplul 1:[edit]

pachete2IN.txt

5
20 15 18 12 13
6
18 9 5 14 63 2

pachete2OUT.txt

11
16

Explicație[edit]

Se fac 5 pachete cu primele două tipuri de produse (punând 4 și respectiv 3 din fiecare) și se fac 6 pachete cu următoarele două tipuri de produse (punând 3 și respectiv 2 din fiecare). Ultimul produs rămâne nefolosit.
Se fac 9 pachete cu primele două produse (punând 2 și respectiv 1 din fiecare), nu se folosește produsul al treilea, se fac 7 pachete cu al patrulea și al cincilea produs (punând 2 și respectiv 9 din fiecare). Ultimul produs rămâne nefolosit.

Exemplul 2:[edit]

pachete2IN.txt

1000001
20 15 18 12 13
6
18 9 5 14 63 2

pachete2OUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit]

<syntaxhighlight lang="python3" line="1"> def cmmdc(a, b):

   while b:
       a, b = b, a % b
   return a

def check_constraints(num_sets, x_values):

   # Constraint 1: 1 ≤ N ≤ 100000
   if not (1 <= num_sets <= 100000):
       return False
   # Constraint 2: Numărul de produse disponibile din fiecare tip este un număr natural nenul cu cel mult 6 cifre.
   for x_list in x_values:
       for x in x_list:
           if not (1 <= x <= 999999):
               return False
   return True

def handle_constraints_error(g):

   g.write("Datele nu corespund restrictiilor impuse\n")

def main():

   try:
       with open("pachete2IN.txt", "r") as f, open("pachete2OUT.txt", "w") as g:
           num_sets = int(f.readline())
           x_values_list = []
           for _ in range(num_sets):
               x_values = list(map(int, f.readline().split()))
               x_values_list.append(x_values)
           if not check_constraints(len(x_values_list), x_values_list):
               handle_constraints_error(g)
               return  # Exit program if constraints are violated
           for x_values in x_values_list:
               n = len(x_values)
               c = [0] * (n + 1)
               m = [0] * (n + 1)
               if n >= 2:
                   x = x_values[0]
                   for i in range(1, n):
                       y = x_values[i]
                       c[i] = cmmdc(x, y)
                       x = y
                   m[1] = 0
                   m[2] = c[1]
                   for i in range(3, n + 1):
                       m[i] = max(m[i - 1], m[i - 2] + c[i - 1])
                   result = str(m[n]) if m[n] != 0 else ""
                   g.write(result + '\n')
   except FileNotFoundError:
       print("Input file 'pachete2IN.txt' not found.")
   except Exception as e:
       print("An error occurred:", e)

if __name__ == "__main__":

   main()

</syntaxhighlight>