2923 - Min Pal: Difference between revisions
Adina Timiș (talk | contribs) Pagină nouă: ==Cerința== Se dă numărul natural n și un șir de n numere naturale. Determinați numărul minim de operații necesare pentru a face șirul palindromic. Singura operație admisă este înlocuirea a două elemente adiacente cu un element care conține suma lor. ==Date de intrare== Programul citește de la tastatură numărul n, iar apoi cele n elemente ale șirului, separate prin spații. ==Date de ieșire== Programul va afișa pe ecran numărul minim de operații pentru... |
Adina Timiș (talk | contribs) |
||
(2 intermediate revisions by the same user not shown) | |||
Line 46: | Line 46: | ||
def min_op_palindrome(arr): | def min_op_palindrome(arr): | ||
n = len(arr) # lungimea șirului | n = len(arr) # lungimea șirului | ||
operations = 0 # inițializăm numărul de operații cu zero | operations = 0 # inițializăm numărul de operații cu zero | ||
# iterăm prima jumătate a șirului | # iterăm prima jumătate a șirului | ||
for i in range(n//2): | for i in range(n//2): | ||
left = arr[i] # primul element, din perechea curentă | left = arr[i] # primul element, din perechea curentă | ||
right = arr[n-i-1] # al doilea element din perechea curentă | right = arr[n-i-1] # al doilea element din perechea curentă | ||
# verificăm dacă unul dintre elemente este 0 și trecem la perechea următoare | # verificăm dacă unul dintre elemente este 0 și trecem la perechea următoare | ||
if left == 0 or right == 0: | if left == 0 or right == 0: | ||
continue | continue | ||
# verificăm dacă cele două elemente sunt egale și trecem la perechea următoare | # verificăm dacă cele două elemente sunt egale și trecem la perechea următoare | ||
if left == right: | if left == right: | ||
continue | continue | ||
# dacă primul element este mai mare decât al doilea, le interschimbăm | # dacă primul element este mai mare decât al doilea, le interschimbăm | ||
if left > right: | if left > right: | ||
left, right = right, left | left, right = right, left | ||
# în timp ce primul element este mai mic decât al doilea, îl dublăm și creștem numărul de operații | # în timp ce primul element este mai mic decât al doilea, îl dublăm și creștem numărul de operații | ||
while left < right: | while left < right: | ||
left *= 2 | left *= 2 | ||
operations += 1 | operations += 1 | ||
return operations # returnăm numărul total de operații | return operations # returnăm numărul total de operații | ||
# programul principal | # programul principal | ||
Line 90: | Line 90: | ||
if __name__ == '__main__': | if __name__ == '__main__': | ||
n = int(input("Introduceti numărul de elemente: ")) # citim lungimea șirului de la tastatură | n = int(input("Introduceti numărul de elemente: ")) # citim lungimea șirului de la tastatură | ||
arr = list(map(int, input("Introduceti elementele sirului: ").split())) # citim elementele șirului de la | arr = list(map(int, input("Introduceti elementele sirului: ").split())) # citim elementele șirului de la | ||
# tastatură și le convertim într-o listă de numere întregi | # tastatură și le convertim într-o listă de numere întregi | ||
# verificarea restricțiilor | # verificarea restricțiilor | ||
if 1 <= n <= 1000000 and all(0 <= arr[i] < 10000 for i in range(n)): | if 1 <= n <= 1000000 and all(0 <= arr[i] < 10000 for i in range(n)): | ||
print("Datele de intrare corespund restricțiilor impuse.") | print("Datele de intrare corespund restricțiilor impuse.") | ||
print(min_op_palindrome(arr)) # afișăm numărul minim de operații necesare pentru a transforma | print(min_op_palindrome(arr)) # afișăm numărul minim de operații necesare pentru a transforma șirul | ||
else: | else: | ||
print("Datele de intrare nu corespund restricțiilor impuse.") | print("Datele de intrare nu corespund restricțiilor impuse.") | ||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 17:03, 5 May 2023
Cerința[edit | edit source]
Se dă numărul natural n și un șir de n numere naturale. Determinați numărul minim de operații necesare pentru a face șirul palindromic. Singura operație admisă este înlocuirea a două elemente adiacente cu un element care conține suma lor.
Date de intrare[edit | edit source]
Programul citește de la tastatură numărul n, iar apoi cele n elemente ale șirului, separate prin spații.
Date de ieșire[edit | edit source]
Programul va afișa pe ecran numărul minim de operații pentru a transforma șirul dat într-un șir palindromic.
Restricții și precizări[edit | edit source]
- 1 ≤ n ≤ 1000.000;
- elementele șirului dat vor fi mai mici decât 10.000;
- un șir este palindromic dacă se citește la fel în ambele sensuri;
Exemplul 1[edit | edit source]
- Intrare
- 4
- 1 4 5 1
- Ieșire
- Datele de intrare corespund restricțiilor impuse.
- 1
Exemplul 2[edit | edit source]
- Intrare
- 0
- 0
- Ieșire
- Datele de intrare nu corespund restricțiilor impuse.
Explicație[edit | edit source]
Se adună 4 cu 5, iar șirul devine 1 9 1
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1">
- 2923 - Min Pal
- definim funcția care primește un șir și returnează numărul minim de operații
- pentru a forma șirul palindromic
def min_op_palindrome(arr):
n = len(arr) # lungimea șirului
operations = 0 # inițializăm numărul de operații cu zero
# iterăm prima jumătate a șirului
for i in range(n//2):
left = arr[i] # primul element, din perechea curentă
right = arr[n-i-1] # al doilea element din perechea curentă
# verificăm dacă unul dintre elemente este 0 și trecem la perechea următoare
if left == 0 or right == 0:
continue
# verificăm dacă cele două elemente sunt egale și trecem la perechea următoare
if left == right:
continue
# dacă primul element este mai mare decât al doilea, le interschimbăm
if left > right:
left, right = right, left
# în timp ce primul element este mai mic decât al doilea, îl dublăm și creștem numărul de operații
while left < right:
left *= 2
operations += 1
return operations # returnăm numărul total de operații
- programul principal
if __name__ == '__main__':
n = int(input("Introduceti numărul de elemente: ")) # citim lungimea șirului de la tastatură
arr = list(map(int, input("Introduceti elementele sirului: ").split())) # citim elementele șirului de la
# tastatură și le convertim într-o listă de numere întregi
# verificarea restricțiilor
if 1 <= n <= 1000000 and all(0 <= arr[i] < 10000 for i in range(n)):
print("Datele de intrare corespund restricțiilor impuse.")
print(min_op_palindrome(arr)) # afișăm numărul minim de operații necesare pentru a transforma șirul
else:
print("Datele de intrare nu corespund restricțiilor impuse.")
</syntaxhighlight>