29192 - Groups
Sursa: 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.", 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
- 2 ⩽ n ⩽ 100.000
Exemple
Exemplul 1
- 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
- Intrare
- 1234567
- Ieșire
- Datele nu corespund restricțiilor impuse.
Rezolvare
<syntaxhighlight lang="python" line>
- 2919
def construire_grupuri(n):
a, b = [], [] k, m = 0, 0 for i in range(1, n + 1): if i % 2 == 1: a.append(i) k += 1 else: b.append(i) m += 1 if n % 2 == 1: for i in range(0, k, 2): if i != k - 1: print(a[i], b[i], end=" ") else: print(a[i], end=" ") # 9 print() for i in range(1, m, 2): print(a[i], b[i], end=" ") else: for i in range(0, k): if i % 2 == 0: print(a[i], end=" ") else: print(b[i], end=" ") print() for i in range(0, k): if i % 2 == 1: print(a[i], end=" ") else: print(b[i], end=" ")
def citire_conform_restrictiilor():
n = int(input()) if n < 2 or n > 100000: print("Datele nu corespund restricțiilor impuse.") exit() print("Datele sunt introduse corect.") return n
if __name__ == '__main__':
n = citire_conform_restrictiilor() construire_grupuri(n)
</syntaxhighlight>
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.
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()".
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.