segunda-feira, 30 de abril de 2018

URI PROBLEMA 2136 - Amigos do Habay SOLUÇÃO EM C

URI Online Judge | 2136

Amigos do Habay

Por Joao Marcos Salvanini Bellini de Moraes, IFSULDEMINAS BR 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);
}

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...