Dentro de la comunidad de programación competitiva existen varias guías acerca de como mejorar y prepararse resolviendo problemas. Esta pequeña guía pretende hacer algo distinto, una lista de comprobación de cosas que hacer antes y durante una competencia de programación.

Antes del contest

  • No tener hambre ni sed
  • No tener ganas de ir al baño
  • Tener agua u otro bebestible a mano
  • Tener snacks a mano por si me de hambre
  • Entrar a Codeforces (o el sitio donde se aloje la competencia) e iniciar sesión.
  • Abrir un archivo de texto para cada problema con la plantilla a usar para la competencia
  • Abrir emulador de terminal en el directorio asignado para la competencia
  • Abrir esta lista de comprobación

Al resolver un problema

  • Leer el enunciado cuidadosamente
  • Determinar exactamente qué es lo que tiene que hacer el programa (matemáticamente si es posible)
  • Comprobar límites de la entrada, de tiempo y de memoria

Encontrar la solución

  • Buscar patrones (programación dinámica, búsqueda binaria, grafos, etc)
  • Reducir a casos sencillos

Implementar la solución

  • Escribir grandes pasos
  • Escribir el código
  • Probar con los casos de ejemplo
  • Probar con pequeños casos borde

Si da Wrong Answer

  • Probar con distintos casos de prueba en los que conozcamos la salida esperada. Si son grandes, generar los casos con números aleatorios y comparar nuestro programa con una solución de búsqueda exhaustiva
  • Inspeccionar el código en busca de errores
  • Intentar demostrar la solución
  • Cambiar los ints por long longs por si hay un overflow escondido.
  • Si todo lo anterior falla, implementar la solución de una forma diferente
  • Si aún así nada funciona, cambiar de problema.

Si da TLE/MLE

  • Reducir constantes
  • Hacer pequeñas optimizaciones (arrays en vez de vectores, uso de variables globales, etc)
  • Si aún así nada funciona, cambiar de problema.

Si da RE

  • Fijarse en los subíndices de los arrays y vectores
  • Evitar divisiones por 0
  • Si todo lo anterior falla, implementar la solución de una forma diferente