-
Notifications
You must be signed in to change notification settings - Fork 44
Description
⏱️ Duración estimada: 1 hora
Objetivo: Reforzar conocimientos de listas, pilas y colas aplicadas a situaciones concretas dentro del universo Refugio 33.
🧠 Ejercicio 1 – Búsqueda de suministros en la lista
En el sistema de gestión del Refugio 33, los recursos se almacenan en una lista dinámica (lista simplemente enlazada) ordenada por nombre. Cada nodo representa un
Supply, con su nombre (clave) y cantidad.
Implementá la función SEARCH(S, k) que devuelva el puntero al suministro con nombre k, o nullptr si no existe.
Extendé la funcionalidad implementando:
MINIMUM(S)– devuelve el suministro alfabéticamente menor.MAXIMUM(S)– idem, pero el mayor.SUCCESSOR(S, x)– dado un suministro, devolvé el siguiente en orden alfabético.
Tip: Podés usar clases simples como
struct Supply { std::string name; int quantity; };
🔁 Ejercicio 2 – Unión de listas de comerciantes
Dos caravanas aliadas llegan al refugio, cada una con una lista ordenada de comerciantes que desean intercambiar bienes. Necesitamos fusionar ambas listas en una sola sin duplicados.
Implementá:
intersect(L1, L2)– devuelve una nueva lista con los comerciantes en común.merge(L1, L2)– devuelve la unión ordenada de las dos listas.
Usá solo operaciones básicas de listas: acceso, inserción, avance de punteros.
💣 Ejercicio 3 – Heaps fusionables con listas
En Refugio 33, los conflictos se manejan con un heap de amenazas. Cada amenaza tiene una prioridad (más baja = más urgente). Queremos representar este heap usando listas enlazadas.
Implementá una estructura ThreatHeap que permita:
INSERTMINIMUMEXTRACT-MINUNION(Heap1, Heap2)
Analizá la complejidad de cada operación en estos tres escenarios:
- Si las listas están ordenadas.
- Si las listas están desordenadas.
- Si las listas están desordenadas y disjuntas.
Consejo: Usá punteros a nodos
Threat { int priority; std::string name; };.
👻 Ejercicio 4 – Eliminación perezosa en listas
Algunos registros de eventos del refugio ya no son válidos, pero por motivos de auditoría, no los eliminamos físicamente. Usamos lazy deletion: marcamos como borrado y solo limpiamos cuando hay tantos borrados como activos.
Implementá:
lazyDelete(x)– marca el nodo como eliminado.realDeleteIfThresholdReached()– si hay tantos borrados como activos, limpia la lista.
Describí:
- Ventajas y desventajas de esta técnica.
- Compará memoria y performance con eliminación inmediata.
🔍 Ejercicio 5 – Implementá tu propio find
A veces, el sistema necesita encontrar un recurso o personaje rápidamente dentro de un rango. Implementá tu propia versión del algoritmo STL
std::find.
template <typename Iterator, typename Object>
Iterator find(Iterator start, Iterator end, const Object& x);Debe retornar el primer iterador donde *it == x, o end si no lo encuentra.
Probalo con una lista de nombres, una lista de enteros, o incluso un vector de NPCs.
🔭 Ejercicio 6 – Quién puede ver a quién en el refugio
Dentro del pasillo principal del Refugio, los habitantes están parados en fila según su altura. Un habitante puede ver a otro si nadie entre medio es más alto que ambos.
Implementá una función que reciba un std::vector<int> alturas y devuelva cuántas personas puede ver cada una hacia la derecha.
std::vector<int> cuantasPuedeVer(const std::vector<int>& alturas);Este ejercicio evalúa comprensión de pilas y recorrido de vectores.