Tarea 4 de Diseño de Algoritmos
Trimestre 2008 Primavera
Entrega: 28 de julio de 2008 a las 22:00.
Problema
1: Sean A y B dos enteros
positivos con A < B. Considere la función recursiva definida
de la siguiente forma: F(N) = B-N para 0 <= N < B y F(N) = F(N-A)
+
F(N-B) para N >= B. Diseña un
algoritmo de programación
dinámica que encuentre el valor
de F(N). Por ejemplo, si A = 1 y B = 2 entonces F(0) = 2, F(1) = 1,
F(2) = F(2-1) + F(2-2), etc.
Escribe un programa llamado lucasZZ
(donde ZZ es una clave de
dos
dígitos asignada por el profesor) basado en tu algoritmo
que acepte como entrada tres números enteros A, B y N y que
escriba como salida el valor de F(N). De nuevo, si la entrada
fuera 1 2 5
entonces la salida debe ser 11.
Puedes suponer que 0 < A < B <= 1,000 y que 0 <= N <=
1,000,000. Página de prueba.
Nota: Como F(N) puede llegar a
ser un número muy grande deberás escribir en la salida el
valor de F(N) módulo 1,000,000.
Ejemplo de
entrada
|
Ejemplo de
salida
|
1 2 5
|
11
|
Problema 2: La leyenda urbana
dice que si vas a la página de Google y buscas "Google" el
universo implotará. Por supuesto esto no es cierto, pero en un
universo paralelo sí es cierto que si vas a la página de
una máquina de búsqueda y buscas su nombre entonces ese
universo implotará. Para prevenir que esto pase, a la gente de
ese universo se le ocurrió la siguiente solución: Todas
las consultas a las máquinas de búsqueda se reúnen
en un sistema central que decide cuáles consultas van a
cuáles máquinas de búsqueda. El sistema central
envía una serie de consultas a una máquina de
búsqueda y puede cambiar de máquina de búsqueda en
cualquier instante. Las consultas deben procesarse en el orden en el
que hayan sido recibidas. El sistema central nunca debe enviar una
consulta a una máquina de búsqueda que coincida con su
nombre. Para reducir costos se debe minimizar la cantidad C de cambios
de máquina de búsqueda.
Como datos se tendrán la cantidad S de máquinas de
búsqueda (numeradas de la 1 a la S), la cantidad Q de consultas
(las que vamos a suponer que coinciden con los nombres de las
máquinas de búsqueda) y las Q consultas B1, B2,
..., BQ (que serán enteros del 1 al S). Por ejemplo,
si S = 5, Q = 10 y B = (1, 1, 5, 4, 5, 2, 4, 2, 3, 5) entonces se puede
resolver con C = 1 cambio, por ejemplo comenzando a enviar las primeras
8 consultas a la máquina de búsqueda número 3 y
las siguientes 2 consultas a la máquina de búsqueda
número 2.
Diseña un algoritmo de programación
dinámica que calcule C. Escribe un programa llamado salvaZZ (donde ZZ es una clave de
dos
dígitos asignada por el profesor) que implemente tu
algoritmo. Puedes suponer que 2 <= S <= 100 y 1 <= Q <=
1000. Página de prueba.
Nota: Este problema fué
adaptado de "Saving the Universe" del Google Summer of Code 2008.
Ejemplo de
entrada |
Ejemplo de
salida |
5
10
1 1 5 4 5 2 4 2 3 5
|
1
|
Notas: Tus programas no deben
leer ni escribir nada adicional a lo que se indica en el enunciado. El
tiempo de ejecución de tus algoritmos será considerado
como parte de la evaluación.