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 i 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 i 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 a e b 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 i 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 i será entre os vencedores dos jogos (i-12)*2+7 e (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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |