2236 - swap01

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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

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 numere naturale, separate prin spații reprezentând elementele șirului binar.


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

  • 1 ≤ n ≤ 100.000

Exemplu 1

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

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 ver. 1

# 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)

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.