3490 - Permutari AB
Enunț[edit | edit source]
Se consideră 2 permutări A şi B ale mulţimii {1, 2, ..., N}. Printr-o operaţie se pot selecta două elemente adiacente din B şi să se interschimbe (i.e. swap(B[i], B[i + 1]) pentru 1 ≤ i < N).
Cerința[edit | edit source]
Să se determine numărul minim de operaţii care trebuiesc efectuate pentru a transforma pe B în A.
Date de intrare[edit | edit source]
Fişierul de intrare permutariab.in conţine pe prima linie numărul natural N. Pe a doua linie se află N numere naturale, separate prin câte un spaţiu, reprezentând permutarea A. Pe a treia linie se află de asemenea N numere naturale, separate prin câte un spaţiu, reprezentând permutarea B.
Date de iesire[edit | edit source]
Fişierul de ieşire permutariab.out conţine pe prima linie numărul natural X, reprezentând numărul minim de operaţii care trebuiesc efectuate pentru a transforma pe B în A.
Restricții și precizări[edit | edit source]
- 1 ≤ N ≤ 100.000
- Pentru 70% din teste, 1 ≤ N ≤ 1000
Exemplu 1[edit | edit source]
permutariabin.txt
6
2 1 3 4 5 6
1 3 4 5 6 2
permutariabout.txt
5
Exemplu 2:[edit | edit source]
permutariabin.txt
10
1 5 2 3 4 6 9 10 7 8
3 9 5 1 2 7 8 10 4 6
permutariabout.txt
17
Explicație[edit | edit source]
În primul exemplu, se interschimbă 2 cu 6, apoi 2 cu 5, apoi 2 cu 4, apoi 2 cu 3 apoi 2 cu 1.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python"> def citeste_permutari():
nume_fisier = 'permutariabin.txt' with open(nume_fisier, 'r') as file: n = int(file.readline()) # Adaugăm verificarea pentru intervalul specificat if not (1 <= n <= 100000): print("Numarul N nu se afla in intervalul permis.") return permutare_A = list(map(int, file.readline().split())) permutare_B = list(map(int, file.readline().split())) return n, permutare_A, permutare_B
def numar_minim_operatii(n, permutare_A, permutare_B):
numar_operatii = 0 for i in range(n - 1): if permutare_B[i] != permutare_A[i]: index = permutare_B.index(permutare_A[i]) permutare_B[i], permutare_B[index] = permutare_B[index], permutare_B[i] numar_operatii += 1 return numar_operatii
def main():
numar, permutare_A, permutare_B = citeste_permutari() numar_operatii = numar_minim_operatii(numar, permutare_A, permutare_B) nume_fisier_iesire = 'permutariabout.txt' with open(nume_fisier_iesire, 'w') as file_out: file_out.write(f"{numar_operatii}\n")
if __name__ == "__main__":
main()
</syntaxhighlight>