Solução Copa do Mundo

Solução por Rogério Júnior

Vamos salvar o ganhador de ada jogo no vetor gan e preenchê-lo jogo por jogo. Deste modo, o ganhador do jogo será um char salvo em gan[i]. Vamos preencher os jogos separando-os por rodadas: primeiro as oitavas, depois as quartas, depois as semis e por fim a final.

Preencher as oitavas é fácil. Imagine que ao invés das letras de 'A' a 'P' tivéssemos números de 0 a 15. Note que o jogo 1 ocorreria entre os times 0 e 1, o 2 ocorreria entre o 2 e o 3, o 3 entre o 4 e o 5, ou seja, de maneira geral, o jogo ocorre entre (i-1)*2 e (i-1)*2+1(i-1)*2. Desse modo, basta lermos os dois números que representam o placar do jogo, se o primeiro for maior, o vencedor seria (i-1)*2, caso contrário, seria (i-1)*2+1. Para convertermos novamente os times para letras, basta somarmos o caractere 'A'. Desse modo, lidos os inteiros que representam o placar, bastaria executarmos os comandos "if(a>b) gan[i]=(i-1)*2+'A'; else gan[i]=(i-1)*2+1+'A';".

Para preenchermos o resultados das quartas, precisaremos dos resultados dos jogos anteriores. Note que que a primeira quarta ocorre entre os vencedores das oitavas 1 e 2. A segunda, entre os das oitavas 3 e 4. Ou seja, de maneira geral, o resultado da i-ésima quarta ocorre entre os ganhadores das oitavas i*2-1 e i*2. Porém, note, que as quartas começam no jogo 9, ou seja, nas quartas, o jogo ocorre entre os vencedores dos jogos (i-8)*2-1 e (i-8)*2.

De maneira análoga, a primeira semi ocorre entre os vencedores da primeira e da segunda oitava, e vemos que o jogo da i-ésima semi ocorre entre os vencedores das quartas i*2-1 e i*2. Entretanto, as quartas começam no jogo 9 e as semis no jogo 13, logo o resultado do jogo será entre os vencedores dos jogos (i-12)*2+7 (i-8)*2+8. Agora resta a final, bastando imprimir o ganhador entre os vencedores dos jogos 13 e 14. Segue o código para melhor entendimento:


#include <cstdio>
#define MAXN 20
char gan[MAXN];
int main(){
// primeiro preencho as oitavas
for(int i=1; i<=8; i++){
// leio e salvo o placar do jogo i
int a, b;
scanf("%d %d", &a, &b);
// e salvo o vencedor em gan[i]
if(a>b) gan[i]=(i-1)*2+'A';
else gan[i]=(i-1)*2+'B';
}
// preencho as quartas
for(int i=9; i<=12; i++){
// leio e salvo o placar
int a, b;
scanf("%d %d", &a, &b);
// e vejo quem ganhou entre os ganhadores dos jogos
// (i-8)*2-1 e (i-8)*2
if(a>b) gan[i]=gan[(i-8)*2-1];
else gan[i]=gan[(i-8)*2];
}
// preencho as semis
for(int i=13; i<=14; i++){
// leio e salvo o placar
int a, b;
scanf("%d %d", &a, &b);
// e vejo quem ganhou entre os ganhadores dos jogos
// (i-12)*2+7 e (i-12)*2+8
if(a>b) gan[i]=gan[(i-12)*2+7];
else gan[i]=gan[(i-12)*2+8];
}
// resta apenas o resultado da final
// leio o placar
int a, b;
scanf("%d %d", &a, &b);
// e imrimo quem ganhou entre os vencedores das duas semis
if(a>b) printf("%c\n", gan[13]);
else printf("%c\n", gan[14]);
return 0;
}

view raw

copa.cpp

hosted with ❤ by GitHub