El peso de este ejercicio en la nota del exámen de la práctica es de un 66.66% (2/3 de la nota).
Nota manual: 50%, nota automática: 50%
El peso de todos los juegos de pruebas en el cálculo de la nota automática es idéntico (público: 2.5/10, privados: 2.5/10 cada uno).
Dadas dos tablas de frecuencias
y
,
queremos una función que actualiza la primera con los datos de la
segunda. Las tablas estarán representadas por
map<string,int>. Todas las frecuencias en
y
son estrictamente positivas.
Como resultado de la actualización la tabla contendrá:
Si es un par de la tabla y no contiene ningún par con clave igual a , entonces está en la tabla final.
Si es un par de la tabla y no contiene ningún par con clave igual a , entonces está en la tabla final.
Si es un par de la tabla y es un par de la tabla entonces está en la tabla final.
Por ejemplo si las tablas y son las mostradas aquí:
4cm
|
4cm
|
entonces después de la actualización será
| a | 11 |
|---|---|
| b | 6 |
| c | 17 |
| d | 7 |
| e | 2 |
Implementa la siguiente función
// Pre: y Post: ver la descripción del enunciado
void actualiza_tabla_frec(map<string,int>& f1, const map<string,int>& f2);
Escribe un pequeño programa que lea una tabla de frecuencias , y a continuación, entra en un bucle en el que en cada iteración se lee una tabla de frecuencias , se actualiza con y se imprime la tabla .
N.B. De cara a obtener una solución lo más eficiente posible, tened en cuenta lo siguiente:
Recorrer un map mediante iteradores de principio a
fin toma tiempo proporcional al tamaño del map—suponiendo
que en cada iteración del recoorido se invierte tiempo
constante.
La clase map tiene un método
insert(iterator,par-clave-valor)
para dar una “pista” sobre dónde debe insertarse el nuevo elemento. Si
insertamos
elementos en orden creciente de clave usando
m.insert(m.end(), x) el coste será proporcional a
;
si se utilizase el método normal m.insert(x) el coste será
mucho mayor, proporcional a
.
Cada tabla de frecuencias se representará en la entrada mediante una secuencia que comienza con un entero seguida de una secuencia de pares describiendo los pares que constituyen la tabla.
La entrada comienza con la subsecuencia que representa a la tabla . A continuación viene una serie de tablas de frecuencia (cada una representada por una secuencia con el formato que hemos descrito arriba). La última tabla de frecuencias de la serie es un tabla vacía ().
Para cada tabla de frecuencias de la serie, excepto la última tabla vacía que marca el final de la serie, se actualiza la tabla con los datos de y se imprime la tabla actualizada. Una tabla de frecuencias se imprime siguiendo el mismo convenio que para la entrada: primero un entero con su tamaño y a continuación una secuencia de los pares que contiene la tabla (separamos las componentes y de cada par mediante un espacio en blanco), pero adicionalmente los pares han de estar en orden creciente de clave (ordenados por la ). Después de imprimir la tabla tras cada actualización se imprime un salto de línea.
Utilizad la plantilla (plantilla-solucion.cc_txt) que os
damos con los ficheros públicos (icono del gatito) para preparar la
solución.
Input
5 a 1 b 1 c 1 d 1 e 1 3 a 1 c 1 f 1 2 b 2 d 2 5 g 1 h 1 a 1 e 1 j 5 0
Output
6 a 1 b 1 c 1 d 1 e 1 f 1 6 a 1 b 2 c 1 d 2 e 1 f 1 9 a 1 b 2 c 1 d 2 e 1 f 1 g 1 h 1 j 5