Para obtener el éxito en estas competencias es muy importante atender dos grandes frentes: Razonamiento lógico-matemático y programación de computadoras. En la ODI los competidores deberán ser capaces de analizar los problemas planteados e identificar conceptos lógico-matemáticos y algorítmicos que le ayuden a resolverlos, y por último escribir las soluciones de los problemas en uno de los lenguajes permitidos: C, C++, Java o Python.
Los competidores deben conocer y entender la estructura básica y la operación de una computadora (CPU, Memoria, E/S). Se espera que sean capaces de utilizar una computadora estándar con una interfaz gráfica, su sistema operativo y el entorno de desarrollo provisto. En particular, deben de tener ciertas competencias en la gestión básica de archivos (creación de carpetas, archivos, copiado y pegado, redireccionamiento de entrada y salida).
¡Esta competencia está abierta a todos! Si eres un principiante absoluto a la programación, puedes iniciar aprendiendo a través de este enlace: http://learn.code.org/. Es un curso de programación totalmente gratuito. La opción para cambiar a español se encuentra en la última parte de esa página.
Tópicos de Competencia
El banco de tópicos de problemas de la ODI es sustancial. Para ayudarte a planificar tu estudio, lo listamos debajo:
Temario 1. Matemáticas
Aritmética y Geometría
Enteros, Operaciones (incl. exponenciación), comparación.
Propiedades de los enteros (positivos, negativos, pares, impares, divisibles, primos).
Fracciones, porcentajes.
Puntos, vectores, coordenadas cartesianas (en 2D).
Distancia Euclidiana, Teorema de Pitágoras.
Segmento de línea, propiedades de la intersección.
Ángulos.
Triángulos, rectángulos, cuadrados, círculos.
Estructuras Discretas
Funciones (inyección, inversas, composición, biyección).
Relaciones (reflexivas, simétricas, transitivas, relaciones de equivalencia, orden total/lineal, orden lexicográfico).
Conjuntos (diagramas de Venn, complementos, productos cartesianos, conjuntos potencias).
Tablas de verdad.
Temario 2: Ciencias de Computación
Fundamentos de Programación
Conocer al menos uno de estos lenguajes: C, C++, Java o Python. ¡No necesariamente es ventaja conocer más de uno!
Variables, tipos, expresiones y asignación.
Entrada/Salida estándar.
Estructuras de condicionales y de iteración.
Funciones y paso de parámetros.
Técnicas de Resolución de Problemas y Algoritmos
Estrategias Generales de Resolución de Problemas (entender-planificar-hacer-revisar, separación de intereses, generalización, especialización, distinción de casos, trabajando hacia atrás).
El rol de los algoritmos en el proceso de resolución de problemas.
Estrategias de implementación para algoritmos.
Estrategias de depuración.
El concepto y propiedades de los algoritmos (corrección, eficiencia).
Estructuras de Datos Fundamentales
Tipos primitivos (valores de verdad (verdadero o falso), enteros, decimales).
Arreglos
Estrategias Algorítmicas
Estrategias de diseño de bucles simples.
Algoritmos computacionales fundamentales
Operaciones simples sobre enteros.
Manipulación simple de arreglos (llenar, desplazar, rotar, invertir, mínimo y máximo, suma de prefijos).
Los participantes pueden usar los siguientes cursos y recursos gratuitos en línea:
Algorithms: Design and Analysis Part 1 (Stanford) at Coursera
CS 161 – Design and Analysis of Algorithms at Stanford OpenClassroom
Libros
Los siguientes libros proveen una buena introducción a las competencias de programación y a los tópicos de las ciencias de la computación involucrados en las mismas:
Skiena, S., Revilla, M. (2008). Desafíos de Programación. NY: Lulu. ISBN 978-1409277293.
Halim, S. (2013). Competitive Programming 3. NY: Lulu.
A Primer for Mathematics Competitions, by Zawaira and Hitchcock
Introduction to Algorithms, by Cormen, Leiserson, Rivest, and Stein
Más libros pueden ser consultados través de la Lista Oficial de Libros recomendados por la IOI.
Lenguajes de Programación
Unos enlaces que enseñan lenguajes de programación en específico:
C++ Language Tutorial: (http://www.cplusplus.com/doc/tutorial/)
Python: (http://www.mclibre.org/consultar/python/)
Recursos En Línea
En Code.Org (http://learn.code.org/) se encuentra un curso gratuito de introducción a la informática y a la programación. Otros sitios como Coursera (www.coursera.org) y Udacity (www.udacity.com) tienen cursos similares, los cuales no asumen ningún conocimiento de programación previo.
En TopCoder (http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=alg_index) se encuentra una rica lista de tutoriales de distintos tipos de algoritmos.
Introducción a Algorítmos (http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/)
En CodingBat (http://codingbat.com/) puedes poner a prueba tu conocimiento de Python.
Otros Concursos y Competencias
HackerRank Algorithms Track