0318 - Cerc: Difference between revisions
Cristina94 (talk | contribs) Pagină nouă: ==Cerinţa== Se dau n numere naturale. Determinaţi o aranjare a acestor numere pe un cerc, astfel încât suma produselor de câte două numere vecine să fie maximă. ==Date de intrare== Fişierul de intrare cerc.in conţine pe prima linie numărul n, iar pe a doua linie cele n numere naturale, separate prin spaţii. ==Date de ieşire== Fişierul de ieşire cerc.out va conţine pe prima linie cele n numere, în ordinea determinată, separate prin exact un spaţiu. ==Rest... |
Cristina94 (talk | contribs) mNo edit summary |
||
(2 intermediate revisions by the same user not shown) | |||
Line 34: | Line 34: | ||
==Explicație== | ==Explicație== | ||
1*2 + 2*4 + 4*6 + 6*5 + 5*3 + 3*1 = 82, şi este suma maximă care se poate obţine. | 1*2 + 2*4 + 4*6 + 6*5 + 5*3 + 3*1 = 82, şi este suma maximă care se poate obţine. | ||
==Exemplu3== | |||
;cerc.in | |||
:-6 | |||
:1 2 3 4 5 6 | |||
Date de intrare invalide: Numărul n trebuie să fie un număr întreg pozitiv. | |||
==Rezolvare== | ==Rezolvare== | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line="1"> | ||
# | #0318 Cerc | ||
from itertools import permutations | from itertools import permutations | ||
Line 49: | Line 56: | ||
return permutari[0] | return permutari[0] | ||
if | def validate_input(n, numere): | ||
with open("cerc.in", "r") as file: | if not isinstance(n, int) or n <= 0: | ||
return False, "Numărul n trebuie să fie un număr întreg pozitiv." | |||
if len(numere) != n or len(set(numere)) != n: | |||
return False, f"Trebuie să introduceți exact {n} numere distincte." | |||
return True, None | |||
def main(): | |||
try: | |||
with open("cerc.in", "r") as file: | |||
n = int(file.readline().strip()) | |||
numere = list(map(int, file.readline().split())) | |||
except (ValueError, FileNotFoundError): | |||
print("Date de intrare invalide sau fișierul nu există.") | |||
return | |||
is_valid, error_message = validate_input(n, numere) | |||
if not is_valid: | |||
print("Date de intrare invalide:", error_message) | |||
return | |||
rezultat = aranjeaza_pe_cerc(n, numere) | rezultat = aranjeaza_pe_cerc(n, numere) | ||
Line 58: | Line 84: | ||
with open("cerc.out", "w") as file_out: | with open("cerc.out", "w") as file_out: | ||
file_out.write(" ".join(map(str, rezultat))) | file_out.write(" ".join(map(str, rezultat))) | ||
if __name__ == "__main__": | |||
main() | |||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 18:58, 9 February 2024
Cerinţa[edit | edit source]
Se dau n numere naturale. Determinaţi o aranjare a acestor numere pe un cerc, astfel încât suma produselor de câte două numere vecine să fie maximă.
Date de intrare[edit | edit source]
Fişierul de intrare cerc.in conţine pe prima linie numărul n, iar pe a doua linie cele n numere naturale, separate prin spaţii.
Date de ieşire[edit | edit source]
Fişierul de ieşire cerc.out va conţine pe prima linie cele n numere, în ordinea determinată, separate prin exact un spaţiu.
Restricţii şi precizări[edit | edit source]
- 1 ≤ n ≤ 10
- cele n numere vor avea cel mult 2 cifre
- dacă există mai multe modalităţi de aranjare a numerelor astfel încât să se obţină aceeaşi sumă maximă, se va determina cea lexicografic minimă
Exemplu 1[edit | edit source]
- cerc.in
- 5
- 1 2 3 4 5
- cerc.out
- 1 2 4 5 3
Explicație[edit | edit source]
1*2 + 2*4 + 4*5 + 5*3 + 3*1 = 48, şi este suma maximă care se poate obţine.
Exemplu 2[edit | edit source]
- cerc.in
- 6
- 1 2 3 4 5 6
- cerc.out
- 1 2 4 6 5 3
Explicație[edit | edit source]
1*2 + 2*4 + 4*6 + 6*5 + 5*3 + 3*1 = 82, şi este suma maximă care se poate obţine.
Exemplu3[edit | edit source]
- cerc.in
- -6
- 1 2 3 4 5 6
Date de intrare invalide: Numărul n trebuie să fie un număr întreg pozitiv.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1">
- 0318 Cerc
from itertools import permutations
def suma_produselor(perm):
return sum(perm[i] * perm[(i + 1) % len(perm)] for i in range(len(perm)))
def aranjeaza_pe_cerc(n, numere):
permutari = list(permutations(numere)) permutari.sort(key=lambda perm: (-suma_produselor(perm), perm))
return permutari[0]
def validate_input(n, numere):
if not isinstance(n, int) or n <= 0: return False, "Numărul n trebuie să fie un număr întreg pozitiv."
if len(numere) != n or len(set(numere)) != n: return False, f"Trebuie să introduceți exact {n} numere distincte."
return True, None
def main():
try: with open("cerc.in", "r") as file: n = int(file.readline().strip()) numere = list(map(int, file.readline().split())) except (ValueError, FileNotFoundError): print("Date de intrare invalide sau fișierul nu există.") return
is_valid, error_message = validate_input(n, numere)
if not is_valid: print("Date de intrare invalide:", error_message) return
rezultat = aranjeaza_pe_cerc(n, numere)
with open("cerc.out", "w") as file_out: file_out.write(" ".join(map(str, rezultat)))
if __name__ == "__main__":
main()
</syntaxhighlight>