Solução Times

0 Flares Facebook 0 0 Flares ×

Solução por Rogério Júnior

Este é um modelo bem simples de um problema de ordenação. No C++, quase sempre usaremos uma função da biblioteca algorithm chamada sort para ordenarmos um vetor. Se você não a conhece, clique aqui. Resumindo, ela tem três parâmetros: o primeiro é um ponteiro para a primeira posição do vetor a ser ordenada, a segunda um ponteiro para a primeira posição do vetor que não será ordenada e a terceira a função de ordenação que usaremos. Se deixarmos o último parâmetro em branco, ela ordenará usando os operadores "<" e ">". Para salvar cada time, usaremos um vector de string de nome Time (para não confundir com a função time, do C), usando portanto uma vetor de vector para representar todos os times. Se você não conhece a string, clique aqui, e se não conhece o vector, clique aqui.

A primeira coisa a fazermos é salvarmos todos os alunos. Para isso, usaremos dois vetores, o string nome[MAXN] e o int hab[MAXN]. Cada aluno será identificado por seu índice na entrada (o primeiro aluno é o 1, o segundo é o 2 e assim por diante) e, em nome[i] estará salvo o nome do aluno i, cuja habilidade estará salva em hab[i]. Depois, iremos declarar um vetor de N números, e iremos preenchê-lo com os números de 1 a N. Este vetor representará a ordem dos alunos por habilidade. Para que isso ocorra, chamaremos o sort. Se chamarmos este vetor de ordem e o indexarmos de 1 a N, o ponteiro para seu começo será ordem+1 e para o seu final será ordem+N+1. O terceiro parâmetro será a função de comparação, que chamaremos de compara. Precisamos criá-la. A compara receberá dois inteiros e retornará uma booltrue se os dois inteiros estiverem ordenados seguindo a ordem que criamos e false caso contrário. Em outras palavras, se a função receber como parâmetros (int x, int y), será true se hab[x]>hab[y]false caso contrário.

Feito isso, teremos os índices dos alunos no vetor ordem totalmente ordenados por habilidade. Agora vamos criar a o vetor de vector de string Time. Vamos percorrer o ordem casa por casa adicionando o nome de cada elemento em um dos vector's de Time. Para fazer isso, faremos um for que percorrerá todo o vetor ordem e usará o resto da posição no módulo T (quantidade de times) para saber em que time tal jogador deve entrar. Para inserir um elemento em um vector usamos a função push_back, do próprio vector, que recebe como parâmetro o elemento a ser inserido no seu final. Feito isso, teremos T vector's e cada um será um time. Agora basta ordená-los com um sort (não precisamos criar função de comparação pois a string já tem os operadores "<" e ">") e imprimir cada um de seus elementos, antecedidos pelo índice do time. Para ordená-los, vale lembrar que, no vector, o ponteiro para o começo é a função begin() e para o fim é a função end(), ambas do próprio vector.

Basta agora notar dois detalhes importantes. Como, no começo e no fim do código, irei ler e imprimir uma string? Para imprimir é fácil, uso o printf como se fosse imprimir uma string do C (vetor de char) e chamo a função c_str(), da string, que converte uma string em string de C. Para imprimir uma string de nome frase, por exemplo, uso o comando "printf("%s", frase.c_str());". Para ler, não podemos usar essa função. Nós usamos um vetor de char auxiliar, lemos a entrada e a salvamos nele e depois fazemos a string receber o valor de auxiliar. Segue o código:

Nosso leitor Roger Benet também apresentou uma solução correta em java:

0 Flares Facebook 0 0 Flares ×
0 Flares Facebook 0 0 Flares ×
%d bloggers like this: