Solução Times

por

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]$$ e 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:

https://gist.github.com/rogerioagjr/b79883bb0c2e1d23f5f4

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

https://gist.github.com/rogerioagjr/ad9117c4b7b03f46b682


Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *