Cómo alcanzar el nivel de matemáticas requerido para participar en el Concurso Internacional de Programación Colegiada

Brian Bi ya ha dado una respuesta maravillosa para presentar una lista de elementos para aprender, pero quiero tratar de responder esta pregunta desde una perspectiva diferente (leer, de una manera más realista y orientada a resultados).


Suponga que lo que está pidiendo es:

¿Qué conocimiento matemático debe aprender para obtener buenos resultados en ICPC?

Para el concurso en sí, diría que intente maximizar la cantidad de problemas que su equipo puede resolver.

Para empezar, ICPC es un concurso de equipo ; Tampoco es un concurso en el que 3 personas se sientan y trabajan en diferentes problemas individualmente, sino que se trata mucho del trabajo en equipo : probablemente escuchaste la idea ” 1 + 1> 2 ” (no matemáticamente); para ICPC diría ” 1 + 1 + 1 >> 3 “. (Existe la parte de adquisición de conocimiento y, la parte de estrategia, y la parte de trabajo en equipo, y probablemente más otras cosas para el concurso, pero no las discutiré en esta respuesta).

Es por eso que supongo que está totalmente bien si no está bien versado en algunos temas más avanzados, como cálculo avanzado y teoría de números avanzada, siempre que uno de los tres miembros del equipo pueda resolver la mayoría de los problemas matemáticos (comunes), eso podría puede ser un problema de probabilidad que le pide que calcule algún tipo de valores esperados, un problema de geometría que requiere resolver un sistema de ecuaciones o un problema de teoría de números que requiere conocer, por ejemplo, el teorema de Lucas. La lista sigue y sigue. (Nota: la palabra “común” también depende en gran medida de la competencia regional en la que participará su equipo).

Lo que quiero señalar aquí es que, si lo siguiente es cierto:

  1. Los tres (en un solo equipo) tienen un conocimiento sólido para cubrir los temas más comunes para sus competencias regionales y las Finales Mundiales, es decir, no requiere que uno de ustedes conozca todas las áreas, pero es mucho mejor si para cada tema común dado, uno de ustedes es un experto (de modo que P (resolver cualquier problema) aumentará),
  2. ustedes tienen un muy buen trabajo en equipo, no podría enfatizar más sobre esto, para que puedan utilizar el tiempo de la máquina y el poder del cerebro de manera eficiente, y
  3. Su equipo tiene suficientes sesiones de entrenamiento que simulan concursos reales y se las arregla para lograr un rendimiento estable y bueno,

entonces hay una buena posibilidad de que su equipo obtenga un buen lugar en concursos reales. (Me doy cuenta de que cada uno de estos puntos fácilmente necesitaría más elaboración, pero me estoy saltando los detalles para centrarme en responder la pregunta original).


Sin embargo, dicho esto, tener algunos conocimientos de matemáticas aún podría ser beneficioso y ayudarlo. En mi collage, tenemos algo llamado ” Prueba de formación de equipo “, donde seleccionamos estudiantes de toda la universidad (bueno, en realidad, generalmente solo los IOI anteriores / concursantes y aquellos que estudian un título de ingeniería estaría interesado en unirse a esta prueba) para representarnos y participar en este prestigioso concurso. Los 3N principales (dependiendo del desempeño de estos concursantes y el presupuesto) generalmente formarían N equipos para representarnos; y de estas personas, los 3 mejores generalmente formarían el equipo que luego (a menudo) avanzaría a las Finales Mundiales.

Supongo que las otras universidades que se toman en serio y están dispuestas a poner recursos en la capacitación de ICPC podrían estar haciendo algo muy similar. En tal prueba, es muy probable que tenga algunos problemas matemáticos intensivos. Entonces, lo que Brian Bi enumeró en su respuesta sería una buena lista. Sin embargo, si tiene confianza y le está yendo lo suficientemente bien en otros temas, digamos que está muy versado en las teorías gráficas y está muy familiarizado con las técnicas de Programación Dinámica (DP) y otras áreas comunes, entonces es posible que ya esté seguro una posición para representar a tu propia universidad.

Una vez que supere esta barrera (o incluso antes de hacerlo), puede comenzar a considerar encontrar un compañero de equipo que pueda compensar sus debilidades.


OK … tal vez también debería volver para responder literalmente a tu pregunta original.

Para completar, aquí hay una lista de elementos (son algo aleatorios; de todos modos no soy un experto en matemáticas) que creo que sería útil para resolver problemas fáciles de medianos en ICPC. Algunos de estos repetirían lo que Brian Bi ha enumerado en su respuesta:

  • Probabilidad básica: aplicaciones de ciertos problemas de DP, …
  • Conteo básico: aplicaciones de combinación (nCr), permutación (nPr), factorial (n!), Idealmente también coeficientes multinomiales, …
  • Geometría básica: productos de puntos, productos cruzados, intersección de dos líneas, cascos convexos, …
  • Teoría básica de números: GCD / LCM, generando primos <= N, módulo de congruencia, módulo inverso, …

Para el conocimiento de la teoría de números en particular, también considere examinar las secciones “Básico” e “Intermedio” en mi respuesta a ¿Qué temas importantes de la teoría de números debería saber cada programador? para una lista más larga


¡Buena suerte!

(Para TopCoder y CodeForces y otros concursos individuales , sería una historia totalmente diferente).

Toma un curso universitario sobre cálculo. El cálculo básico diferencial e integral que se enseña en un curso introductorio es tanto cálculo como sea necesario. De hecho, ni siquiera necesita saber todas las pruebas; solo las aplicaciones (extremos, área bajo una curva, centro de masa / gravedad, etc. )

Tome un curso sobre probabilidad básica y estadísticas. Lo más importante es aprender a calcular los valores esperados. El principio de inclusión / exclusión también es útil. Cadenas de Markov aparecen ocasionalmente. En general, debe sentirse cómodo con las distribuciones de probabilidad, pero no necesita conocer ninguna de las cosas muy teóricas (como las funciones generadoras de momentos). Un poco de combinatoria será útil: siéntase cómodo con factoriales, permutaciones y combinaciones.

Aprende algo de teoría básica de números. Debe saber sobre aritmética modular, números primos y factorizaciones primas, el Tamiz de Eratóstenes, los campos [math] \ mathbb {Z} _p [/ math], inversos modulares y exponenciación modular, el algoritmo euclidiano extendido, el pequeño teorema de Fermat y su generalización del teorema de Fermat-Euler, la fórmula de inversión de Möbius y posiblemente otros temas que me he perdido …

Lea los Tutoriales de Algoritmo de TopCoder. Algunos de ellos son sobre matemáticas.

¡Práctica práctica práctica!

Si por matemático quieres decir PURAMENTE matemático (es decir, no hay cosas como paradigmas de resolución de problemas, estructuras de datos, algoritmos de gráficos o procesamiento de cadenas); eso sería combinatronics, probabilidad, teoría de números, teoría de juegos y quizás algo de geometría.

Tienes 2 enfoques.

1) Tome un libro como Competitive Programming, 3rd Edition: Steven Halim: Amazon.com: Books, vaya a la sección de matemáticas y pruebe los problemas. Si no tiene las herramientas matemáticas pero tiene el razonamiento, busque ese concepto en Google y agréguelo a su cuaderno.

2) Tome un libro sobre cualquiera de los temas que mencioné y a medida que avance y aprenda el material, vaya a UVa Online Judge – Home o cualquier otro juez en línea y resuelva problemas en ese dominio.

¿Cuál es mejor? Depende de en qué fase estés como programador competitivo en este momento.

¿Cuáles son los temas matemáticos que se cubrirán para la programación competitiva como acm, topcoder, facebook hackers cup, google code jam, codechef?

Ya hay una respuesta para esta pregunta:
¿Cuáles son algunos temas imprescindibles en matemática discreta y probabilidad de programación competitiva?
Revísalo y disfruta de la codificación.

Esta pregunta ya ha sido respondida aquí. ¿Puede alguien proporcionarme una lista de todos los algoritmos necesarios para ACM-ICPC?