Ranking de tenis (2) U14997


Statement
 

pdf   zip   main.cc

En el tenis profesional, las clasificaciones de la ATP y la WTA ordenan a los jugadores y jugadoras por los puntos acumulados durante la temporada. Periódicamente, se publica una clasificación actualizada que muestra, además de los puntos, los cambios de posición respecto a la clasificación anterior: [+N] si el jugador ha subido N posiciones, [-N] si ha bajado, o [=] si se mantiene.

Haced un programa que, dada una lista de jugadores con sus puntos actuales y una secuencia de actualizaciones de puntos, muestre la nueva clasificación con los cambios de posición respecto a la anterior.

Para facilitar la lectura de la entrada, se dispone de una función llegeix_jugador en el fichero main.cc descargable, que lee una línea de la primera parte de la entrada y devuelve el código, los puntos y el nombre del jugador:

// Lee un jugador de la entrada.
// Devuelve cierto si se ha leído correctamente, falso si se ha llegado a "---".
bool llegeix_jugador(string& codi, string& nom, int& punts);

Observación

En este problema el centro de interés es la eficiencia. Hay que encontrar una forma inteligente de almacenar los jugadores para poder actualizar sus puntos sin hacer búsquedas innecesarias.

Como el problema es de tipo G++17, hay que enviar un solo fichero .cc con todo el programa. Se puede usar el main.cc proporcionado como base.

Entrada

La entrada tiene dos partes, separadas por una línea con ---.

La primera parte contiene la lista de jugadores, uno por línea. Cada línea tiene un código de 6 caracteres (letras mayúsculas y dígitos), seguido de un espacio, un entero con los puntos actuales del jugador, otro espacio, y el nombre del jugador (que puede contener espacios) hasta el final de línea.

La segunda parte contiene una secuencia de parejas código puntos, una por línea, donde código es el código de un jugador de la primera parte y puntos es un entero con signo (+N o -N) que indica los puntos ganados o perdidos. La secuencia acaba con fin de entrada.

Salida

La nueva clasificación, con un jugador por línea, en formato:

posición. Nombre del Jugador - puntos [cambio]

ordenada de más a menos puntos. Si un grupo de jugadores tiene los mismos puntos, se ordenan por nombre. La posición empieza en 1. El cambio es [+N] si el jugador ha subido N posiciones, [-N] si ha bajado, o [=] si se mantiene en la misma posición.

Public test cases
  • 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]
    
  • Information
    Author
    Pau Fernández
    Language
    Spanish
    Translator
    Pau Fernández
    Original language
    Catalan
    Other languages
    Catalan
    Official solutions
    C++
    User solutions
    C++