Skip to content

Instantly share code, notes, and snippets.

@rogerioagjr
Created February 29, 2016 23:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rogerioagjr/3926dbd33b9d7c5fe238 to your computer and use it in GitHub Desktop.
Save rogerioagjr/3926dbd33b9d7c5fe238 to your computer and use it in GitHub Desktop.
Fórmula 1
#include <cstdio> // scanf e printf
#include <algorithm> // sort
#include <cstring> // memset
using namespace std;
// struct que representa um piloto
struct piloto {
int pontos, id, pos[110];
};
// função que compara pilotos
bool cmp (piloto a, piloto b){
// ela dá prioridade à maior pontuação
if(a.pontos > b.pontos) return true;
if(a.pontos < b.pontos) return false;
// e usa o menor valor de id como desempate
return a.id < b.id;
}
// declaro as variáveis que vou usar
int g, p, s, k;
piloto vet[110];
int main(){
// para cada caso dado na entrada
while(scanf("%d %d", &g, &p) and g != 0){
// para cada piloto
for(int i = 1; i <= p; i++){
// atribuo o valor inicial correto a cada elemento seu
vet[i].id = i;
vet[i].pontos = 0;
memset(vet[i].pos, 0, sizeof vet[i].pos);
}
// para cada GP
for(int i = 0; i < g; i++)
// olho a posição de cada piloto
for(int j = 1; j <= p; j++){
// salvo-a em x
int x;
scanf("%d", &x);
// e aumento, em vet[j], o número de vezes
// que o piloto j chegou na posição x
vet[j].pos[x]++;
}
// leio o número de sistemas de pontuação
scanf("%d", &s);
// e analiso cada sistema
while(s--){
// leio quantas posições valem pontos
scanf("%d", &k);
// e para cada posição i que vale ponto
for(int i = 1; i <= k; i++){
// salvo em x quantos ponto ela vale
int x;
scanf("%d", &x);
// e adiciono no elemento pontos de cada piloto
// os pontos que ele ganhou por cada vez que chegou na posição i
for(int j = 1; j <= p; j++) vet[j].pontos += vet[j].pos[i] * x;
}
// ordeno o vetor de pilotos
sort(vet+1, vet+1+p, cmp);
// imprimo o id do primeiro piloto
printf("%d",vet[1].id);
// e de todos os seguintes que têm a mesa pontuação do primeiro
int x = 2;
while(vet[x].pontos == vet[1].pontos){
printf(" %d",vet[x].id);
x++;
}
// imprimo a quebra de linha
printf("\n");
// e zero os pontos de cada piloto
// para analisar o próximo sistema
for(int i = 1; i <= p; i++) vet[i].pontos = 0;
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment