Considereu un torneig de tennis amb participants, amb noms , on és una potència de dos. A la primera ronda, juga contra , juga contra , …, i juga contra . Els jugadors que perden queden eliminats, i el procés es repeteix amb els jugadors restants. Quan només queda un jugador, aquest és el guanyador del torneig.
Per exemple, sigui , i suposem que a la primera ronda ha guanyat a , ha perdut amb , ha guanyat a , i ha guanyat a . A la segona ronda i s’enfronten entre si (suposem que guanya ), i i s’enfronten entre si (suposem que guanya ). A la tercera i última ronda i s’enfronten entre si. Suposant que guanyi , aquest és el campió. La figura següent mostra el campionat tot just descrit en forma d’arbre:
Cal que feu un procediment que, donats els noms dels jugadors i la taula de resultats, retorni el nom del guanyador del torneig:
string guanyador(const vector<string>& nom, const vector<bool>& guanya);
El vector @nom@ té mida , on és qualsevol potència de 2. Per a cada @j@ entre 0 i , es té @nom[j]@ . Tots els noms són diferents.
Per exemple, aquesta podria ser la taula de noms del torneig descrit anteriorment:
El vector @guanya@ té mida i conté els resultats dels partits en el format següent: la primera ronda es guarda a les últimes posicions, la segona ronda es guarda a les posicions anteriors, la tercera ronda es guarda a les posicions anteriors, …, i el resultat de l’última roda (la final) es guarda a @guanya[0]@. El booleà de cada posició indica si el primer jugador (el de menor índex) ha guanyat al segon.
Aquesta seria la taula de resultats del torneig descrit anteriorment:
Per al torneig d’exemple, la resposta hauria de ser
“Borg”.
Només cal enviar el procediment demanat; el programa principal serà ignorat.