1119 - Permutare 1

De la Universitas MediaWiki
Versiunea din 3 iunie 2024 16:51, autor: AjM (discuție | contribuții) (Pagină nouă: == Enunt == Se dă o matrice cu m linii şi n coloane, fiecare linie reprezentând o permutare. Se ştie că liniile de la 2 la m sunt permutări circulare ale primei linii. Unei linii x (1 ≤ x ≤ m) i se pot aplica următoarele operaţii: * o permutare circulară la stânga: elementul de pe poziţia i (1 < i ≤ n) se mută pe poziţia i-1, mai puţin primul primul element, care devine ultimul; * o permutare circulară la dreapta: elementul de pe pozitia i (1 ≤ i < n)...)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)

Enunt

Se dă o matrice cu m linii şi n coloane, fiecare linie reprezentând o permutare. Se ştie că liniile de la 2 la m sunt permutări circulare ale primei linii. Unei linii x (1 ≤ x ≤ m) i se pot aplica următoarele operaţii:

  • o permutare circulară la stânga: elementul de pe poziţia i (1 < i ≤ n) se mută pe poziţia i-1, mai puţin primul primul element, care devine ultimul;
  • o permutare circulară la dreapta: elementul de pe pozitia i (1 ≤ i < n) se mută pe poziţia i+1, mai puţin ultimul element care devine primul.

Scopul este să permutăm circular liniile, la stânga sau la dreapta, astfel încât în final toate liniile să fie egale, folosind un număr minim de operaţii.

Cerinţa

Dându-se o matrice cu proprietatea din enunţ se cere să se determine numărul minim de operaţii necesare pentru a ajunge la o matrice în care toate liniile sunt egale.

Date de intrare

Fișierul de intrare permutare1.in conține pe prima linie două numere naturale m şi n, reprezentând numărul de linii şi numărul de coloane ale matricei. Pe a doua linie a fişierului de intrare se află n numere naturale, reprezentând permutarea de pe prima linie a matricei. Pe următoarele m-1 linii, se află câte un număr natural cuprins între 0 şi n-1. Al i-lea (0 < i < m) dintre aceste numere reprezintă numărul de poziţii cu care este permutată circular la dreapta a (i+1) -a linie faţă de linia 1.

Date de ieșire

Fișierul de ieșire permutare1.out va conține pe prima linie un singur număr natural reprezentând numărul minim de operaţii necesare.

Restricţii şi precizări

  • 1 ≤ n, m ≤ 100 000
  • Două linii dintr-un tablou sunt egale dacă elementele aflate pe aceeaşi coloană sunt egale.

Exemplu

permutare1.in
pre.6 5
3 1 4 2 6 5
1
1
3
3
permutare1.out
5


Explicație

Matricea va fi:

 3 1 4 2 6 5
 5 3 1 4 2 6
 5 3 1 4 2 6
 2 6 5 3 1 4
 2 6 5 3 1 4

Dacă permutăm circular la dreapta prima linie cu o poziţie, iar liniile 4 şi 5 le permutăm la stânga cu două poziţii, vom obţine din 5 operaţii o matrice cu toate liniile egale între ele. Liniile vor fi determinate de permutarea: 5 3 1 4 2 6.

Rezolvare

def min_operations_to_equalize_first_row(matrix, n):
    first_row = matrix[0]
    min_operations = n
    for i in range(n):
        operations = 0
        for j in range(n):
            if matrix[i][j] != first_row[j]:
                operations += 1
        min_operations = min(min_operations, operations)
    return min_operations

def main():
    with open("permutare1.in", "r") as fin:
        m, n = map(int, fin.readline().split())
        matrix = [list(map(int, fin.readline().split())) for _ in range(m-1)]

    min_ops = min_operations_to_equalize_first_row(matrix, n)

    with open("permutare1.out", "w") as fout:
        fout.write(str(min_ops) + "\n")

if __name__ == "__main__":
    main()