Repository navigation
Expand file tree
/
Copy pathas08.cc
More file actions
116 lines (93 loc) · 2.66 KB
/
Copy pathas08.cc
File metadata and controls
116 lines (93 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
Pucminas - Ciência da Computação - Coração Eucarístico
LPA G1 - Segunda - Manhã
Nome: Pedro Henrique Lima Carvalho
Matricula: 651230
AS08
Análise:
Algoritmo calcula o número de movimentos de um valor do arranjo para a esquerda quando da ordenação.
Utiliza-se o mergeSort com a contagem desses movimentos. O mergeSort a cada nível de recursão, fase de divisão,
divide o problema em 2. Na volta da recursão, merge, em cada nível da recursão, realiza n comparações.
Assim, o algoritmo tem complexidade O(n Lg n), sendo n o tamanho do arranjo a ser ordenado.
*/
//Macros
#define MAX 0x7ffffff
//Dependencias
#include <iostream>
//Namespace
using namespace std;
/*
mergeSort - Método de ordenamento usando merge sort
@param int arr[], int i, int j, int& cont -> int[] a ordenar, índice esquerda, índice direita, contagem movimentacoes
@return int* -> arranjo ordenado
*/
int* mergeSort(int arr[], int i, int j, int& cont){
//Declaracoes
int tamanho = j-i +2;
int* resultado = new int[tamanho];
//Sentinela
resultado[tamanho-1] = MAX;
//Caso base - Arranjo de um elemento
if(i == j){
resultado[0] = arr[i];
}
else{
//Declaracoes
int* esq;
int* dir;
int k = (j+i)/2;
int i_esq = 0; //indice esquerda
int i_dir = 0; //indice direita
//Chamada recursiva
esq = mergeSort(arr, i, k, cont);
dir = mergeSort(arr, k+1, j, cont);
//Merge
for(int i_resultado = 0; i_resultado<tamanho-1; i_resultado++){
if(esq[i_esq] > dir[i_dir]){
resultado[i_resultado] = dir[i_dir];
i_dir++;
cont += k-i+1-i_esq; //quantos movimetacoes dir[i_dir] fez para esquerda
}
else{
resultado[i_resultado] = esq[i_esq];
i_esq++;
}
}
//liberar memória
delete esq;
delete dir;
}
//return
return resultado;
}
/*
Main
*/
int main(){
//Declaracoes
int tamanho;
//ler número de casos
cin >> tamanho;
//ler até tamanho == 0
while(tamanho){
//Declaracoes
int arranjo[tamanho];
int movimentos = 0;
//preencher arranjo
for(int i=0; i<tamanho; i++){
cin >> arranjo[i];
}
delete mergeSort(arranjo, 0, tamanho-1, movimentos);
//mostrar resposta
if(movimentos%2==0){
cout << "Carlos" << endl;
}
else{
cout << "Marcelo" << endl;
}
//ler próxima etapa
cin >> tamanho;
}
//return
return 0;
}