2236 - swap01: Difference between revisions
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/2236/swap01 2236 - swap01] ---- Se consideră un șir binar a[1], a[2], …, a[n]. Asupra șirului se poate efectua operația swap(i, j) prin care se interschimbă valorile a[i] și a[j]. == Cerinţa == Să se determine numărul minim de operații swap care pot fi efectuate astfel încât toate valorile de 1 să apară pe poziții consecutive în șir. == Date de intrare == Programul citește de la tastatură numărul n, iar apoi n n... |
No edit summary |
||
(2 intermediate revisions by the same user not shown) | |||
Line 13: | Line 13: | ||
== Date de ieșire == | == 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 '''umărul minim de operații swap care pot fi efectuate astfel încât toate valorile de 1 să apară pe poziții consecutive în șir''', reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: '''"Datele nu corespund restricțiilor impuse."'''. | |||
== Restricţii şi precizări == | == Restricţii şi precizări == | ||
* 1 ≤ n ≤ 100.000 | * 1 ≤ n ≤ 100.000 | ||
== Exemplu == | == Exemplu 1 == | ||
; Intrare | ; Intrare | ||
: 14 | : 14 | ||
: 1 0 0 1 0 1 1 0 1 0 0 0 1 0 | : 1 0 0 1 0 1 1 0 1 0 0 0 1 0 | ||
; Ieșire | ; Ieșire | ||
: Datele sunt introduse correct. | |||
: 2 | : 2 | ||
== Exemplu 2 == | |||
; Intrare | |||
: 2 3 5 | |||
: 1 1 1 0 0 0 1 0 0 1 1 0 1 1 1 | |||
; Ieșire | |||
: Datele nu corespund restricțiilor impuse. | |||
== Rezolvare == | == Rezolvare == | ||
Line 29: | Line 40: | ||
# 2236 - swap01 | # 2236 - swap01 | ||
def | def validate_input(n, arr): | ||
n = | if not (1 <= n <= 100000): | ||
return False | |||
if len(arr) != n: | |||
return False | |||
return True | |||
def count_swaps(n, arr): | |||
if not validate_input(n, arr): | |||
return "Datele nu corespund restricțiilor impuse." | |||
# Determinăm numărul de valori de 1 din șir | |||
count_ones = arr.count(1) | |||
# Numărul minim de operații swap este diferența dintre lungimea șirului și numărul de valori de 1 | |||
min_swaps = n - count_ones | |||
return min_swaps | |||
return | |||
if __name__ == "__main__": | if __name__ == "__main__": | ||
n = int(input()) | |||
arr = list(map(int, input().split())) | |||
print( | |||
result = count_swaps(n, arr) | |||
print(result) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== Explicatie Rezolvare == | == Explicatie Rezolvare == | ||
Avem funcția validate_input care verifică dacă datele de intrare sunt valide. Verificăm dacă n se află în intervalul [1, 100000] și dacă lungimea listei arr este egală cu n. | |||
Funcția principală count_swaps primește numărul de elemente n și lista arr ca argumente. În primul rând, verificăm validitatea datelor de intrare folosind funcția validate_input. Apoi, numărăm numărul de valori de 1 din șir utilizând metoda count a listei. Numărul minim de operații swap este diferența dintre lungimea șirului n și numărul de valori de 1 count_ones. | |||
În blocul if __name__ == "__main__":, citim valorile de intrare n și arr folosind funcția input(). Apoi apelăm funcția count_swaps și afișăm rezultatul. | |||
Latest revision as of 21:20, 14 May 2023
Sursa: 2236 - swap01
Se consideră un șir binar a[1], a[2], …, a[n]. Asupra șirului se poate efectua operația swap(i, j) prin care se interschimbă valorile a[i] și a[j].
Cerinţa[edit | edit source]
Să se determine numărul minim de operații swap care pot fi efectuate astfel încât toate valorile de 1 să apară pe poziții consecutive în șir.
Date de intrare[edit | edit source]
Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații reprezentând elementele șirului binar.
Date de ieșire[edit | edit source]
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou umărul minim de operații swap care pot fi efectuate astfel încât toate valorile de 1 să apară pe poziții consecutive în șir, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".
Restricţii şi precizări[edit | edit source]
- 1 ≤ n ≤ 100.000
Exemplu 1[edit | edit source]
- Intrare
- 14
- 1 0 0 1 0 1 1 0 1 0 0 0 1 0
- Ieșire
- Datele sunt introduse correct.
- 2
Exemplu 2[edit | edit source]
- Intrare
- 2 3 5
- 1 1 1 0 0 0 1 0 0 1 1 0 1 1 1
- Ieșire
- Datele nu corespund restricțiilor impuse.
Rezolvare[edit | edit source]
Rezolvare ver. 1[edit | edit source]
<syntaxhighlight lang="python" line>
- 2236 - swap01
def validate_input(n, arr):
if not (1 <= n <= 100000): return False if len(arr) != n: return False return True
def count_swaps(n, arr):
if not validate_input(n, arr): return "Datele nu corespund restricțiilor impuse."
# Determinăm numărul de valori de 1 din șir count_ones = arr.count(1)
# Numărul minim de operații swap este diferența dintre lungimea șirului și numărul de valori de 1 min_swaps = n - count_ones
return min_swaps
if __name__ == "__main__":
n = int(input()) arr = list(map(int, input().split()))
result = count_swaps(n, arr) print(result)
</syntaxhighlight>
Explicatie Rezolvare[edit | edit source]
Avem funcția validate_input care verifică dacă datele de intrare sunt valide. Verificăm dacă n se află în intervalul [1, 100000] și dacă lungimea listei arr este egală cu n.
Funcția principală count_swaps primește numărul de elemente n și lista arr ca argumente. În primul rând, verificăm validitatea datelor de intrare folosind funcția validate_input. Apoi, numărăm numărul de valori de 1 din șir utilizând metoda count a listei. Numărul minim de operații swap este diferența dintre lungimea șirului n și numărul de valori de 1 count_ones.
În blocul if __name__ == "__main__":, citim valorile de intrare n și arr folosind funcția input(). Apoi apelăm funcția count_swaps și afișăm rezultatul.