Como estamos tratando de ultrapassagens, então o algoritmo de ordenação InsertionSort consegue caracterizar muito bem a simulação que precisaremos fazer. A grande diferença entre uma ordenação normal e a ordenação que precisamos fazer aqui é que nosso objetivo não é colocar todos os elementos na ordem crescente, e sim colocar na ordem dos carros ao final da corrida. Podemos fazer isso guardando a informação de cada posição de cada elemento ao final e usar esta posição desejada como parâmetro de comparação.
#include<stdio.h>int pos_final[25];intcomp(int a,int b){return pos_final[a] - pos_final[b];}voidswap(int*a,int*b){int aux =*a;*a =*b;*b = aux;}intinsertionSort(int*V,int n){int inversoes =0;for (int i =1; i < n; ++i) {int j = i, k = j -1;while (k >-1&&comp(V[j], V[k])<0) {swap(&V[j],&V[k]);++inversoes;--j,--k; } }return inversoes;}intmain(){int N, comeco[24], final[24];while (scanf("%d",&N)!= EOF) {for (int i =0; i < N; ++i) {scanf("%d",&comeco[i]); }for (int i =0; i < N; ++i) {scanf("%d",&final[i]); pos_final[final[i]] = i; }printf("%d\n", insertionSort(comeco, N)); }return0;}
#include<iostream>#include<vector>usingnamespace std;vector<int> pos_final;boolcomp(int a,int b){returnpos_final[a] <pos_final[b];}template <classT>intinsertionSort(vector<T> &V){int n =V.size();int inversoes =0;for (int i =0; i < n; ++i) {int j = i, k = j -1;while (k >-1&&comp(V[j],V[k])) {swap(V[k],V[j]);++inversoes;--j,--k; } }return inversoes;}intmain(){int N; vector<int> comeco,final;while (cin >> N) {comeco.assign(N,0);for (int i =0; i < N; ++i) { cin >>comeco[i]; }final.assign(N,0);pos_final.assign(N +1,0);for (int i =0; i < N; ++i) { cin >>final[i];pos_final[final[i]] = i; } cout <<insertionSort(comeco) << endl; }return0;}
var input =require('fs').readFileSync('/dev/stdin','utf8');var lines =input.trim().split('\n');let pos_final = {};constcomp= (a, b) => pos_final[a] - pos_final[b];constinsertionSort= (V) => {let inversoes =0;for (let i =1; i <V.length; ++i){let j = i, k = j -1;while(k >-1&&comp(V[j],V[k]) <0){ [V[k],V[j]] = [V[j],V[k]];++inversoes;--j,--k; } }return inversoes;};while(lines.length){letN=parseInt(lines.shift().trim());let comeco =lines.shift().trim().split(' ').map((x) =>parseInt(x));let final =lines.shift().trim().split(' ').map((x) =>parseInt(x));for (let i =0; i <N; ++i){ pos_final[final[i]] = i; }console.log(insertionSort(comeco));}
pos_final = []defcomp(a,b):return pos_final[a]- pos_final[b]definsertionSort(V): inversoes =0for i inrange(1, len(V)): j = i k = j -1while(k >-1andcomp(V[j], V[k])<0): V[j], V[k]= V[k], V[j] inversoes +=1 j -=1 k -=1return inversoeswhileTrue:try: N =int(input()) comeco = [int(x)for x ininput().strip().split(' ')] final = [int(x)for x ininput().strip().split(' ')] pos_final = [0for _ inrange(N +1)]for i, carro inenumerate(final): pos_final[carro]= iprint(insertionSort(comeco))exceptEOFError:break