F002B. Vectors comprimits

A vegades cal manipular vectors numèrics que tenen un 0 a la majoria de posicions. En aquests casos, es pot estalviar memòria i temps de càlcul usant la tècnica dels vectors comprimits, que consisteix a guardar només els valors diferents de 0, juntament amb la posició on es troben.

Per exemple, per representar el vector v=(0,3,0,0,8,0,0,3,5,0,0,0,0)v = (0,3,0,0,8,0,0,-3,5,0,0,0,0) s’utilitza el vector comprimit amb quatre parells següent:

0 1 2 3


3;1 8;4 3-3;7 5;8

Aquest vector comprimit indica que hi ha un 3 a la posició 1 del vector vv, un 8 a la posició 4, un 3-3 a la posició 7, un 5 a la posició 8, i que a la resta de posicions hi ha un 0.

Fixeu-vos que en els vectors comprimits només es guarden les posicions que tenen un valor diferent de 0, i que la taula es troba ordenada creixentment segons les posicions.

Les definicions següents permeten utilitzar vectors comprimits d’enters:

    struct Parell {
        int valor;                           // Diferent de zero
        int pos;                             // Més gran o igual que zero
    };

    typedef vector<Parell> Vec_Com;          // Ordenat per pos!

Utilitzant aquestes definicions, implementeu la funció

    Vec_Com suma(const Vec_Com& v1, const Vec_Com& v2); 

que retorna la suma, component a component, de dos vectors comprimits |v1| i |v2| donats.

Implementeu també l’acció

    void llegeix(Vec_Com& v);

que llegeix, d’acord amb el format dels exemples, un vector comprimit, i el desa a |v|.

El programa principal ja se us dóna implementat; no el canvieu. Aquest llegeix primer un natural kk. Després llegeix kk parelles de vectors comprimits, els suma i n’escriu el resultat. L’acció que escriu vectors comprimits també se us dóna implementada; queda estrictament prohibit cambiar-la. Fixeu-vos que tant a l’entrada com a la sortida apareix explícitament el nombre de valors diferents de 0 del vector. Fixeu-vos també que la llargada que tenia el vector original (no comprimit) és irrellevant en aquest problema.

Observació

Useu algun mètode eficient per implementar |suma()|. Altrament, el Jutge rebutjarà la vostra solució per ser massa lenta. Inspireu-vos en algun dels algorismes fonamentals vistos a classe.

Informació del problema

Autoria: Professorat de P1

Generació: 2026-01-25T10:38:27.514Z

© Jutge.org, 2006–2026.
https://jutge.org