29192 - Groups: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/2919/2groups 2919 - 2Groups] ---- == Cerinţa == Se dă numărul natural '''n'''. Să se împartă numerele naturale de la 1 la n în două grupuri astfel încât diferența absolută dintre sumele numerelor din cele două grupuri să fie minimă. == Date de intrare == Programul citește de la tastatură numărul '''n'''. == Date de ieșire == Dacă datele sunt introduse corect, pe ecran se va afișa: '''"Datele sunt introduse corect."...
 
 
(2 intermediate revisions by the same user not shown)
Line 27: Line 27:
; Intrare
; Intrare
: 1234567
: 1234567
: 1 2 3
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: Datele nu corespund restricțiilor impuse.
<br>
<br>
== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
Line 35: Line 37:


def construire_grupuri(n):
def construire_grupuri(n):
     a, b = [], []
     vector1, vector2 = [], []
     k, m = 0, 0
     lungime_vector_1, lungime_vector_2 = 0, 0
     for i in range(1, n + 1):
     for i in range(1, n + 1):
         if i % 2 == 1:
         if i % 2 == 1:
             a.append(i)
             vector1.append(i)
             k += 1
             lungime_vector_1 += 1
         else:
         else:
             b.append(i)
             vector2.append(i)
             m += 1
             lungime_vector_2 += 1
     if n % 2 == 1:
     if n % 2 == 1:
         for i in range(0, k, 2):
         for i in range(0, lungime_vector_1, 2):
             if i != k - 1:
             if i != lungime_vector_1 - 1:
                 print(a[i], b[i], end=" ")
                 print(vector1[i], vector2[i], end=" ")
             else:
             else:
                 print(a[i], end=" ") # 9
                 print(vector1[i], end=" ")
         print()
         print()
         for i in range(1, m, 2):
         for i in range(1, lungime_vector_2, 2):
             print(a[i], b[i], end=" ")
             print(vector1[i], vector2[i], end=" ")
     else:
     else:
         for i in range(0, k):
         for i in range(0, lungime_vector_1):
             if i % 2 == 0:
             if i % 2 == 0:
                 print(a[i], end=" ")
                 print(vector1[i], end=" ")
             else:
             else:
                 print(b[i], end=" ")
                 print(vector2[i], end=" ")
         print()
         print()
         for i in range(0, k):
         for i in range(0, lungime_vector_1):
             if i % 2 == 1:
             if i % 2 == 1:
                 print(a[i], end=" ")
                 print(vector1[i], end=" ")
             else:
             else:
                 print(b[i], end=" ")
                 print(vector2[i], end=" ")




def citire_conform_restrictiilor():
def citire_conform_restrictiilor(n):
    n = int(input())
     if n < 2 or n > 100000:
     if n < 2 or n > 100000:
         print("Datele nu corespund restricțiilor impuse.")
         print("Datele nu corespund restricțiilor impuse.")
         exit()
         exit()
     print("Datele sunt introduse corect.")
     print("Datele sunt introduse corect.")
    return n




if __name__ == '__main__':
if __name__ == '__main__':
     n = citire_conform_restrictiilor()
     n = int(input())
    citire_conform_restrictiilor(n)
     construire_grupuri(n)
     construire_grupuri(n)




Line 95: Line 97:
</syntaxhighlight>
</syntaxhighlight>
== Explicație rezolvare==
== Explicație rezolvare==
  Acest program primește ca input un număr n și un vector de n numere naturale și determină câte dintre elementele vectorului sunt prime cu ultimul element.<br>  Mai întâi, există o funcție numită "citire_conform_restrictiilor" care se asigură că input-ul îndeplinește restricțiile (numărul de elemente este între 1 și 200, iar elementele vectorului sunt între 0 și 1000) și că numărul de elemente este egal cu n. Dacă programul primește input care nu îndeplinește restricțiile specificate, atunci se afișează un mesaj de eroare corespunzător și programul se oprește prin apelul funcției "exit()".<br>  Funcția "nr_elem_prime_cu_ultimul" primește vectorul și lungimea acestuia și apoi parcurge fiecare element din vector. Pentru fiecare element, se calculează limita superioară, adică rădăcina pătrată a elementului, plus 1. Apoi se parcurg toate numerele impare de la 3 până la limita superioară și se verifică dacă elementul este divizibil cu ele. Dacă nu este divizibil cu niciunul dintre acești divizori, atunci numărul este considerat prim și se incrementează numărul de elemente prime găsite, dar dacă ultimul element este 1, toate elementele din vector nu vor fi prime între ele, așadar numar_elemente_prime va fi 0. În cele din urmă, programul afișează numărul de elemente prime găsite.
    Acest cod definește două funcții: "construire_grupuri(n)" și "citire_conform_restrictiilor()" care vor fi apelate în main-ul programului '''if __name__ == '__main__':''' (linia 43) după citirea numărului n (linia 44) care se face cu ajutorul comenzii input() și int() pentru a îl converti în număr întreg.<br>  Funcția '''citire_conform_restrictiilor()''' verifică dacă n se încadrează în intervalul [2, 100000]. Dacă nu, afișează "Datele nu corespund restricțiilor impuse." și oprește programul prin apelarea funcției exit(). În caz contrar, afișează "Datele sunt introduse corect.".<br>  Pentru a crea două grupuri astfel încât diferența absolută dintre sumele numerelor din cele două să fie minimă folosim doi vectori în funcția '''construire_grupuri(n)''' vector1 și vector 2. Mai întâi, se inițializează cei doi vectori goi, vector1 și vector2, care vor conține numerele până la n împărțite în două subliste separate. De asemenea, se inițializează două variabile, lungime_vector_1 și lungime_vector_2, care vor reprezenta lungimile celor două subliste.<br>  Apoi, într-o buclă for care parcurge numerele de la 1 la n, fiecare număr impar este adăugat la vector1, iar fiecare număr par este adăugat la vector2. În același timp, variabilele lungime_vector_1 și lungime_vector_2 sunt actualizate pentru a reflecta noile lungimi ale celor două liste.<br>  Dacă n este impar, atunci bucla for ulterioră va parcurge doar elementele din vector1 și vector2 pentru a le grupa în perechi. Se folosește o buclă for care parcurge elementele din vector1 și vector2 începând cu primul element din vector1 și fiecare al doilea element din fiecare listă este afișat ca un grup de două elemente, până la ultimul element din vector1, care va fi afișat separat, în afara grupului de două elemente. După aceea, o altă buclă for este folosită pentru a afișa restul grupurilor de câte două elemente din vector1 și vector2.<br> 
Dacă n este par, bucla for ulterioară va afișa elementele din vector1 și vector2 într-un mod specific. Mai întâi, se afișează primele grupuri de două elemente formată din vector1 și vector2 în ordine alternativă, astfel încât primul element din vector1 este afișat primul. Apoi, o altă buclă for este utilizată pentru a afișa restul grupurilor de câte două elemente din vector1 și vector2, în ordine inversă, astfel încât primul element din vector2 este afișat primul.<br>  În final, funcția '''construire_grupuri(n)''' afișează pe două linii separate de grupuri de numere, după ce grupurile de numere au fost construite în ordinea specificată mai sus.

Latest revision as of 10:58, 26 April 2023

Sursa: 2919 - 2Groups


Cerinţa[edit]

Se dă numărul natural n. Să se împartă numerele naturale de la 1 la n în două grupuri astfel încât diferența absolută dintre sumele numerelor din cele două grupuri să fie minimă.

Date de intrare[edit]

Programul citește de la tastatură numărul n.

Date de ieșire[edit]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează numerele din primul grup și pe al următorul rând numerele din al doilea grup, separate prin câte un spațiu. Ordinea afișării nu contează. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări[edit]

  • 2n100.000

Exemple[edit]

Exemplul 1[edit]

Intrare
5
Ieșire variantă 1 (există mai multe modalității de așezare a acestor grupuri, ordinea afișării nu contează. Ceea ce contează e diferența absolută dintre sumele numerelor din cele două grupuri să fie 1.)
Datele sunt introduse corect.
1 2 5
3 4
Ieșire variantă 2
Datele sunt introduse corect.
5 2
4 3 1

Exemplul 2[edit]

Intrare
1234567
1 2 3
Ieșire
Datele nu corespund restricțiilor impuse.


Rezolvare[edit]

<syntaxhighlight lang="python" line>

  1. 2919

def construire_grupuri(n):

   vector1, vector2 = [], []
   lungime_vector_1, lungime_vector_2 = 0, 0
   for i in range(1, n + 1):
       if i % 2 == 1:
           vector1.append(i)
           lungime_vector_1 += 1
       else:
           vector2.append(i)
           lungime_vector_2 += 1
   if n % 2 == 1:
       for i in range(0, lungime_vector_1, 2):
           if i != lungime_vector_1 - 1:
               print(vector1[i], vector2[i], end=" ")
           else:
               print(vector1[i], end=" ")
       print()
       for i in range(1, lungime_vector_2, 2):
           print(vector1[i], vector2[i], end=" ")
   else:
       for i in range(0, lungime_vector_1):
           if i % 2 == 0:
               print(vector1[i], end=" ")
           else:
               print(vector2[i], end=" ")
       print()
       for i in range(0, lungime_vector_1):
           if i % 2 == 1:
               print(vector1[i], end=" ")
           else:
               print(vector2[i], end=" ")


def citire_conform_restrictiilor(n):

   if n < 2 or n > 100000:
       print("Datele nu corespund restricțiilor impuse.")
       exit()
   print("Datele sunt introduse corect.")


if __name__ == '__main__':

   n = int(input())
   citire_conform_restrictiilor(n)
   construire_grupuri(n)








</syntaxhighlight>

Explicație rezolvare[edit]

   Acest cod definește două funcții: "construire_grupuri(n)" și "citire_conform_restrictiilor()" care vor fi apelate în main-ul programului if __name__ == '__main__': (linia 43) după citirea numărului n (linia 44) care se face cu ajutorul comenzii input() și int() pentru a îl converti în număr întreg.
Funcția citire_conform_restrictiilor() verifică dacă n se încadrează în intervalul [2, 100000]. Dacă nu, afișează "Datele nu corespund restricțiilor impuse." și oprește programul prin apelarea funcției exit(). În caz contrar, afișează "Datele sunt introduse corect.".
Pentru a crea două grupuri astfel încât diferența absolută dintre sumele numerelor din cele două să fie minimă folosim doi vectori în funcția construire_grupuri(n) vector1 și vector 2. Mai întâi, se inițializează cei doi vectori goi, vector1 și vector2, care vor conține numerele până la n împărțite în două subliste separate. De asemenea, se inițializează două variabile, lungime_vector_1 și lungime_vector_2, care vor reprezenta lungimile celor două subliste.
Apoi, într-o buclă for care parcurge numerele de la 1 la n, fiecare număr impar este adăugat la vector1, iar fiecare număr par este adăugat la vector2. În același timp, variabilele lungime_vector_1 și lungime_vector_2 sunt actualizate pentru a reflecta noile lungimi ale celor două liste.
Dacă n este impar, atunci bucla for ulterioră va parcurge doar elementele din vector1 și vector2 pentru a le grupa în perechi. Se folosește o buclă for care parcurge elementele din vector1 și vector2 începând cu primul element din vector1 și fiecare al doilea element din fiecare listă este afișat ca un grup de două elemente, până la ultimul element din vector1, care va fi afișat separat, în afara grupului de două elemente. După aceea, o altă buclă for este folosită pentru a afișa restul grupurilor de câte două elemente din vector1 și vector2.
Dacă n este par, bucla for ulterioară va afișa elementele din vector1 și vector2 într-un mod specific. Mai întâi, se afișează primele grupuri de două elemente formată din vector1 și vector2 în ordine alternativă, astfel încât primul element din vector1 este afișat primul. Apoi, o altă buclă for este utilizată pentru a afișa restul grupurilor de câte două elemente din vector1 și vector2, în ordine inversă, astfel încât primul element din vector2 este afișat primul.
În final, funcția construire_grupuri(n) afișează pe două linii separate de grupuri de numere, după ce grupurile de numere au fost construite în ordinea specificată mai sus.