Problemas y Algoritmos de Olimpiada de InformÆtica 3 8 4 7 6 2 9 1 5 9 7 7 7 9 6 6 Por Luis E. Vargas Azcona Algunas imagenes por Roberto L(cid:243)pez 2 Acuerdo de Licencia Esta obra estÆ bajo una licencia Atribuci(cid:243)n-No comercial-Licenciamiento Rec(cid:237)proco 2.5 MØxico de Creative Commons. Eres libre de: copiar, distribuir y comunicar pœblicamente la obra hacer obras derivadas Bajo las condiciones siguientes: Atribuci(cid:243)n. Debes reconocer la autor(cid:237)a de la obra en los tØrminos especi(cid:28)ca- dos por el propio autor o licenciante. No comercial. No puedes utilizar esta obra para (cid:28)nes comerciales. Licenciamiento Rec(cid:237)proco. Si alteras, transformas o creas una obra a partir de esta obra, solo podrÆs distribuir la obra resultante bajo una licencia igual a Østa. Al reutilizar o distribuir la obra, tiene que dejar bien claro los tØrminos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Nada en esta licencia menoscaba o restringe los derechos morales del autor. Los derechos derivados de usos leg(cid:237)timos u otras limitaciones reconocidas por ley no se ven afectados por lo anterior. Esto es solamente un resumen fÆcilmente legible del texto legal de la licencia. Para ver una copia de esta licencia, visite http://creativecommons.org/licenses/by-nc- sa/2.5/mx/ o envie una carta a Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA. 3 4 Prefacio El prop(cid:243)sito general de este libro, es el de introducir al lector en la resoluci(cid:243)n de problemas de programaci(cid:243)n as(cid:237) como en el diseæo de algoritmos. Si bien se presentan algoritmos, el objetivo no es saturar el conocimiento del lector con una gran cantidad de algoritmos sino mostar sus fundamentos, mostrar tambiØn maneras inteligentes de usarlos para resolver problemas, y sobre todo, lograr que el lector sea capaz de diseæar sus propios algoritmos. Muchos libros de algoritmos se limitan a explicar algoritmos sin detenerse en su fun- damento matemÆtico y sin decir las aplicaciones que tiene en soluci(cid:243)n de problemas. Algunosotrossiexplicanelfundamentodelosalgoritmos,peroresultaninadecuados para estudiantes con poco conocimiento matemÆtico ya que suelen dar por hecho que el lector ya sabe teor(cid:237)a de conjuntos y matemÆticas discretas. Este libro estÆ dirigido a estudiantes con gusto de programar y resolver problemas pero que todav(cid:237)a no adquieren las bases matemÆticas necesarias para poder leer libros de algoritmos con su(cid:28)ciente fundamento matemÆtico; por lo que se pretende, no solamente explicar los algoritmos, sino tambiØn darle al lector las herramientas necesarias para entender, analizar y diseæar. Por ello, una gran cantidad de pÆginas se dedican a establecer las bases matemÆticas que sirven como soporte para la resoluci(cid:243)n de problemas de programaci(cid:243)n. Los temas tratados en este libro son indispensables para comprender el gran campo de estudio de la soluci(cid:243)n de problemas mediante el uso de las computadoras, consti- tuyenlosfundamentosdeunacantidadinterminabledeconocimientosytØcnicasque estan en constante desarrollo por la investigaci(cid:243)n en las ciencias de la computaci(cid:243)n. En el libro se muestran implementaciones en C++ que no usan memoria dinÆmica ni estructuras, esto es por los siguientes motivos: A veces al tener el pseudoc(cid:243)digo de un algoritmo, no resulta claro c(cid:243)mo im- plementarlo sin escribir demasiado. Por ello es preferible mostrar algunas im- plementaciones de ejemplo para que el lector conozca al menos una implemen- taci(cid:243)n corta de cada algoritmo. Muchos elementos del lenguaje C++ son muy conocidos e incluso estan pre- sentes en otros lenguajes, con una syntaxis casi idØntica a la de C++, por ello, 5 6 si se utilizan pocos elementos del lenguaje, es posible que un lector que no estØ familiarizado con este lenguaje pueda igualmente entender los c(cid:243)digos. No estÆ por demÆs decir que este libro fue escrito pensando en participantes de un concurso llamado olimpiada de informÆtica, en ese concurso los parti- cipantes tienen tiempo limitado para implementar y depurar sus programas y las implementaciones son mas fÆciles de depurar con memoria estÆtica. Al Estudiante Puede parecer extraæo encontrar un libro de algoritmos con estas caracter(cid:237)sticas, ya que dedica muchas pÆginas a los fundamentos matemÆticos y omite varias cosas que varios libros de algoritmos orientados a licenciatura no dejar(cid:237)an pasar por alto, como lo son quicksort, shellsort, listas circulares, listas doblemente ligadas y tablas de dispersi(cid:243)n entre otras cosas. Elmotivodeestoessimple:estelibronopretendeserunareferencianimuchomenos un repaso de los temas de licenciatura; pretende aportar las herramientas bÆsicas para aplicar la programaci(cid:243)n en la resoluci(cid:243)n de problemas. Por esto mismo puede llegar a ser un recurso valioso ya que permite abordar la programaci(cid:243)n desde un punto de vista mas creativo y menos repetitivo, y al mismo tiempo el enfoque a resolver nuevos problemas es la base de la inovaci(cid:243)n. Este libro esta hecho para leerse casi como si fuera una novela, un cap(cid:237)tulo tras otro, y si se decide saltarse uno o mas cap(cid:237)tulos se corre el riesgo de que mas adelante no se pueda seguir bien. La diferencia con una novela es la gran cantidad de problemas de ejemplo, los cuales conviene intentar resolver antes de leer la soluci(cid:243)n. Al Instructor La teor(cid:237)a necesaria para leer este libro de principio a (cid:28)n es muy poca, incluso un alumno de preparator(cid:237)a la deber(cid:237)a de saber. Sin embargo, muchos problemas que se mencionan, por si di(cid:28)cultad, estan lejos de ser adecuados para cualquier alumno de preparatoria e incluso pueden darle di(cid:28)cultades a graduados de la universidad; pero resultan bastante adecuados para aquellos que buscan algo mas interesante que problemas de rutina o para quienes se preparan para concursos de programaci(cid:243)n. El libro estÆ escrito de la manera en la que me gustar(cid:237)a presentar los temas si fuera yo el instructor. Es decir, procura motivar todos los conceptos antes de abordarlos formalmente, intenta nunca dejar huecos, en la teor(cid:237)a; y sobre todo, buscar aplicaciones creativas a cada tema que se aborda evitando decir muy rÆpido la soluci(cid:243)n y dando tiempo para especular. 7 Para resolver un problema, es necesario plantearse un diÆlogo consigo mismo de preguntas y respuestas. Dicho diÆlogo tambiØn se debe de presentar entre alumno e instructor y en muchas partes del libro se intenta plasmar el diÆlogo abordando los razonamientos que podr(cid:237)an llevar al lector a resolver cada uno de los ejemplos. Al Ol(cid:237)mpico Este libro lo escrib(cid:237) pensando principalmente en los ol(cid:237)mpicos, por lo que todo lo que semencionaaqu(cid:237)tieneaplicaci(cid:243)ndirectaoindirectaconlaolimpiadadeinformÆtica. La olimpiada esta centrada en resolver problemas mediante la programaci(cid:243)n y el diseæo de algoritmos; para ello se requieren bases matemÆticas s(cid:243)lidas y un conoci- miento profundo(aunque no necesariamente amplio) de los algoritmos. Es por eso que este libro dedica muchas pÆginas a dejar claras las bases matemÆticas y a explorar las propiedades de algoritmos y no solo en introducirlos. Los ejemplos se deben de intentar resolver por cuenta propia para aprender de los propios errores e ir desarrollando poco a poco un mØtodo propio para resolver problemas. Si de pronto no logras resolver un ejemplo, puedes empezar a leer la soluci(cid:243)n para darte una idea y continuar por cuenta propia. 8 ˝ndice general I Recursi(cid:243)n 13 1. Inducci(cid:243)n MatemÆtica 17 1.1. Ejemplos de Inducci(cid:243)n . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.2. Errores Comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 1.3. De(cid:28)nici(cid:243)n de Inducci(cid:243)n . . . . . . . . . . . . . . . . . . . . . . . . . . 25 1.4. Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.4.1. Sumas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.4.2. Tablero de Ajedrez . . . . . . . . . . . . . . . . . . . . . . . . 27 1.4.3. Chocolate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 1.5. Sugerencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2. De(cid:28)nici(cid:243)n y Caracter(cid:237)sticas de la Recursi(cid:243)n 31 2.1. Factorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.2. Imprimir Nœmeros en Binario . . . . . . . . . . . . . . . . . . . . . . 34 2.3. Los Conejos de Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . 35 3. Recursi(cid:243)n con Memoria o Memorizaci(cid:243)n 39 3.1. Mejorando el Rendimiento de Fibonacci . . . . . . . . . . . . . . . . 39 3.2. Error Comœn en la Memorizaci(cid:243)n . . . . . . . . . . . . . . . . . . . . 41 3.3. Triangulo de Pascal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.4. Teorema del Binomio . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4. Divide y VencerÆs 45 4.1. MÆximo en un Arreglo . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.2. Bœsqueda Binaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 4.3. Torres de Hanoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 5. Bœsqueda Exhaustiva 53 5.1. Cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 5.2. Conjuntos y Subconjuntos . . . . . . . . . . . . . . . . . . . . . . . . 57 5.3. Permutaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 9 10 ˝NDICE GENERAL II AnÆlisis de Complejidad 65 6. TØcnicas BÆsicas de Conteo 69 6.1. Reglas BÆsicas de Conteo . . . . . . . . . . . . . . . . . . . . . . . . . 71 6.2. Conjuntos, Subconjuntos, Multiconjuntos . . . . . . . . . . . . . . . . 73 6.3. Permutaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 6.4. Combinaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 6.5. Separadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 7. Funciones 83 7.1. Las Funciones como Reglas . . . . . . . . . . . . . . . . . . . . . . . . 83 7.2. El Concepto Formal de Funci(cid:243)n . . . . . . . . . . . . . . . . . . . . . 86 8. AnÆlisis de Complejidad 89 8.1. Un ejemplo no muy computacional . . . . . . . . . . . . . . . . . . . 90 8.2. Algunos Ejemplos de Complejidad en Programas . . . . . . . . . . . . 90 8.3. Funci(cid:243)n de Tiempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 8.4. La Necesidad del S(cid:237)mbolo O . . . . . . . . . . . . . . . . . . . . . . . 94 8.5. De(cid:28)nici(cid:243)n de la notaci(cid:243)n O-mayœscula . . . . . . . . . . . . . . . . . 96 8.6. Mœltiples Complejidades en Notaci(cid:243)n O-Mayœscula . . . . . . . . . . 99 8.7. CuÆndo Un Algoritmo es Factible y CuÆndo Buscar Otro . . . . . . . 99 9. Reglas para Medir la Complejidad 101 9.1. Regla de la Suma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 9.2. Producto por Constante . . . . . . . . . . . . . . . . . . . . . . . . . 103 9.3. Regla del Producto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 9.4. Complejidad en Polinomios . . . . . . . . . . . . . . . . . . . . . . . . 105 9.5. Medir antes de implementar . . . . . . . . . . . . . . . . . . . . . . . 106 9.6. Bœsqueda de Cotas Mayores . . . . . . . . . . . . . . . . . . . . . . . 107 10.Complejidades Logar(cid:237)tmicas 109 10.1.AnÆlisis de la Bœsqueda Binaria . . . . . . . . . . . . . . . . . . . . . 109 10.2.Bases de logaritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 10.3.Complejidades O(NlogN) . . . . . . . . . . . . . . . . . . . . . . . . 111 11.Complejidades en Funciones Recursivas 113 11.1.Estados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 11.2.Cortes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Description: