En el tennis professional, les classificacions de l’ATP i la WTA
ordenen els jugadors i jugadores pels punts acumulats durant la
temporada. Periòdicament, es publica una classificació actualitzada que
mostra, a més dels punts, els canvis de posició respecte a la
classificació anterior: [+N] si el jugador ha pujat
N posicions, [-N] si ha baixat, o
[=] si es manté.
Feu un programa que, donada una llista de jugadors amb els seus punts actuals i una seqüència d’actualitzacions de punts, mostri la nova classificació amb els canvis de posició respecte a l’anterior.
Per facilitar la lectura de l’entrada, es disposa d’una funció
llegeix_jugador al fitxer main.cc
descarregable, que llegeix una línia de la primera part de l’entrada i
retorna el codi, els punts i el nom del jugador:
// Llegeix un jugador de l'entrada.
// Retorna cert si s'ha llegit correctament, fals si s'ha arribat a "---".
bool llegeix_jugador(string& codi, string& nom, int& punts);
En aquest problema el centre d’interès és l’eficiència. Cal trobar una forma intel·ligent d’emmagatzemar els jugadors per poder actualitzar els seus punts sense fer cerques innecessàries.
Com que el problema és de tipus G++17, cal enviar un sol
fitxer .cc amb tot el programa. Es pot fer servir el
main.cc proporcionat com a base.
L’entrada té dues parts, separades per una línia amb
---.
La primera part conté la llista de jugadors, un per línia. Cada línia té un codi de 6 caràcters (lletres majúscules i dígits), seguit d’un espai, un enter amb els punts actuals del jugador, un altre espai, i el nom del jugador (que pot contenir espais) fins al final de línia.
La segona part conté una seqüència de parelles codi punts,
una per línia, on codi és el codi d’un jugador de la primera
part i punts és un enter amb signe (+N o
-N) que indica els punts guanyats o perduts. La seqüència
acaba amb fi d’entrada.
La nova classificació, amb un jugador per línia, en format:
posició. Nom del Jugador - punts [canvi]
ordenada de més a menys punts. Si un grup de jugadors té els mateixos
punts, s’ordenen per nom. La posició comença en 1. El canvi és
[+N] si el jugador ha pujat N posicions,
[-N] si ha baixat, o [=] si es manté a la
mateixa posició.
Input
FED001 2500 Roger Federer NAD002 2800 Rafa Nadal ALC003 1200 Carlos Alcaraz DJO004 2600 Novak Djokovic SIN005 1800 Jannik Sinner --- FED001 +443 NAD002 -256 ALC003 +1124 DJO004 +150 SIN005 +850
Output
1. Roger Federer - 2943 [+2] 2. Novak Djokovic - 2750 [=] 3. Jannik Sinner - 2650 [+1] 4. Rafa Nadal - 2544 [-3] 5. Carlos Alcaraz - 2324 [=]
Input
GAU001 100 Paula Garcia Ruiz MOR002 200 Anna Moreno --- GAU001 +250 MOR002 +50
Output
1. Paula Garcia Ruiz - 350 [+1] 2. Anna Moreno - 250 [-1]