URI Online Judge | 2136
Amigos do Habay
Por Joao Marcos Salvanini Bellini de Moraes, IFSULDEMINAS
Brazil
Timelimit: 1
Todo final de ano ocorre uma festa na Instituição de Educação Fantástica (IEF). Logo no início de julho, são abertas as inscrições para participar dela. No momento da inscrição, o usuário pode escolher se quer ser "O Amigo do Habay" na festa ou não. O mais lógico seria escolher a opção Sim, afinal, é um privilégio ser O Amigo do Habay, já que ele é a pessoa mais descolada do IEF. Porém, há indivíduos que definitivamente não pretendem ser O Amigo do Habay, e por motivos desconhecidos.
Somente um será o escolhido. Em vista disso, muitos alunos que escolheram a opção Sim realizaram a inscrição diversas vezes para aumentar a própria probabilidade de ser O Amigo do Habay. O organizador geral da festa contratou você para organizar as inscrições do site, pois está havendo um spam de inscrições. O critério para ser o escolhido é a quantidade de letras do primeiro nome, e em caso de empate, vence aquele que realizou primeiro a inscrição. A organização final dos inscritos deverá seguir a ordem de escolha (Sim ou Não), mas respeitando a ordem alfabética.
OBS.: Ninguém que escolheu a opção Não realizou a inscrição mais de uma vez.
Entrada
A entrada contém somente um caso de teste. Cada linha é composta pelo primeiro nome do participante (sem espaços), seguido da opção YES (caso o usuário queira ser O Amigo do Habay) ou NO (caso não queira). A entrada termina assim que o usuário digita "FIM" (sem as aspas).
Saída
Seu programa deverá imprimir os inscritos pela ordem de escolha e por ordem alfabética, seguido do nome do vencedor. Imprima uma linha em branco entre a lista de inscritos e o nome do vencedor.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
typedef struct{
char nome[50];
char escolha[4];
} Candidato;
int compara(const void *, const void *);
int main(){
Candidato candidato[10000];
char esc[50];
int i, j, escolhido;
for(i = 0; scanf("%s %s", candidato[i].nome, candidato[i].escolha) &&
strcmp(candidato[i].nome, "FIM") != 0; i++)
for(j = escolhido = 0; j < i; j++){
if(!strcmp(candidato[escolhido].escolha, "YES")){
if(!strcmp(candidato[j+1].escolha, "YES") && strlen(candidato[escolhido].nome) < strlen(candidato[j+1].nome))
escolhido = j+1;
}else{
escolhido++;
j++;
}
}
strcpy(esc, candidato[escolhido].nome);
qsort(candidato, i, sizeof(Candidato), compara);
printf("%s\n",candidato[0].nome);
for(j = 1; j < i; j++)
if(strcmp(candidato[j].nome, candidato[j-1].nome))
printf("%s\n",candidato[j].nome);
printf("\nAmigo do Habay:\n%s\n", esc);
return 0;
}
int compara(const void *p1, const void *p2){
Candidato *i = (Candidato *) p1, *j = (Candidato *) p2;
if(strcmp(j->escolha, i->escolha) == 0)
return strcmp(i->nome, j->nome);
else
return strcmp(j->escolha, i->escolha);
}