quinta-feira, 25 de outubro de 2018

URI PROBLEMA 1588 - Ajude a Federação SOLUÇÃO EM C

URI Online Judge | 1588

Ajude a Federação

Por Bruno Adami, Universidade de São Paulo - São Carlos BR Brazil
Timelimit: 1
A federação de futebol te contratou para elaborar a classificação dos times do campeonato. Você vai receber uma lista com alguns jogos ocorridos e deve ordenar os times. Uma vitória garante 3 pontos ao time, um empate 1 ponto e uma derrota 0 pontos.
Leia atentamente a seguir o regulamento sobre como a classificação deve ser feita: Primeiramente o time com mais pontos deve ficar em primeiro. Caso haja empate, o time com mais vitórias fica na frente. Caso ainda tenha empate, o time com mais gols fica na frente. Por último se nenhum dos critérios acima possa desempatar os times, o que aparecer primeiro na entrada fica na frente.
Dado os times e os jogos que já aconteceram, ordene e imprima o nome dos times na ordem de classificação.

Entrada

Na primeira linha teremos um inteiro T (T ≤ 100), indicando o número de casos de teste.
Na primeira linha de cada caso teremos dois números, N (2 ≤ ≤ 20* ou 2 ≤ N ≤ 100**) e M (1 ≤ M ≤ 100* ou 1 ≤ M≤ 1000**), indicando quantos times estão no campeonato e quantos jogos já aconteceram. Nas próximas N linhas teremos os nomes dos times, que são únicos, contendo apenas letras minúsculas do alfabeto. Nas próximas Mlinhas há a informação dos jogos na seguinte forma: X timeA Y timeB, indicando que o timeA jogou contra o timeB e o primeiro marcou X gols e o segundo Y gols. As strings terão tamanho entre 1 e 20 e o número de gols de um time em cada partida será entre 0 e 100.Um time nunca joga contra ele mesmo, porém ele pode jogar inúmeras vezes contra qualquer outro time.
* ocorrerá em aproximadamente 90% dos casos de teste;
** ocorrerá no restante dos casos.

Saída

Imprima na ordem de classificação os times da entrada, um time em cada linha. Não é necessário imprimir nada entre os casos de teste!



#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>

#define TAM 21

typedef struct {
char nome[TAM];
int pontos,gols_marcados,vitorias;
} times;

int compara(const void *p1,const void *p2){
times *i=(times *)p1,*j=(times *)p2;
if(i->pontos > j->pontos){
return -1;
}else if(i->pontos < j->pontos){
return 1;
}else{
if(i->vitorias > j->vitorias){
return -1;
}else if(i->vitorias < j->vitorias){
return 1;
}else{
if(i->gols_marcados > j->gols_marcados){
return -1;
}else if(i->gols_marcados < j->gols_marcados){
return 1;
}else{
return 0;
}
}
}
}

int main (int argc,char *argv[]){
int t, g, g1, g2,numtest;
int cont,y,x;

char t1[TAM], t2[TAM];
scanf("%d",&numtest);
for(x=0;x<numtest;x++){
scanf("%d %d",&t,&g);
if (t == 0 && g == 0)
break;

times time[t];
for (cont=0; cont<t; cont++){
scanf(" %s",time[cont].nome);
time[cont].pontos = 0;
time[cont].gols_marcados = 0;
time[cont].vitorias=0;
}

for (cont=0; cont<g; cont++){
scanf("%d %s %d %s",&g1,t1,&g2,t2);
for(y=0;y<t;y++){
if(strcmp(time[y].nome,t1)==0){
time[y].gols_marcados+=g1;
if (g1 > g2){
time[y].pontos += 3;
time[y].vitorias++;
}else if(g1==g2){
time[y].pontos += 1;
}else{
time[y].pontos += 0;
}
}
if(strcmp(time[y].nome,t2)==0){
time[y].gols_marcados+=g2;
if (g1 < g2){
time[y].pontos += 3;
time[y].vitorias++;
}else if(g1==g2){
time[y].pontos += 1;
}else{
time[y].pontos += 0;
}
}
}
}
qsort(time,t,sizeof(time[0]),compara);
for(cont=0;cont<t;cont++){
printf("%s\n",time[cont].nome);
}
}
return 0;
}

Nenhum comentário:

Postar um comentário

URI PROBLEMA 1133 - Resto da Divisão SOLUÇÃO EM C

URI Online Judge | 1133 Resto da Divisão Adaptado por Neilor Tonin, URI   Brasil Timelimit: 1 Escreva um programa que leia 2 valo...