Inicio » Entrenamiento

Entrenamiento

💪 Entrenamiento en Programación Competitiva

La programación competitiva es una disciplina que combina lógica, estructuras de datos, algoritmos y creatividad para resolver problemas con eficacia y precisión. En CodeBoost aplicamos este enfoque para ayudarte a mejorar tus habilidades como programador/a y futuro ingeniero/a.


💡 ¿Qué es la programación competitiva?

Es una práctica que consiste en resolver problemas algorítmicos en tiempo limitado, normalmente en competiciones tipo “maratón” donde se valora:

  • ✔️ Correctitud: el programa debe producir la salida esperada para todos los casos.
  • Eficiencia: el programa debe ejecutarse en menos de un límite de tiempo dado.
  • 🎯 Precisión: una solución incompleta o incorrecta no suma puntos.

Este estilo de programación se entrena y se mejora como un deporte: con práctica, estrategia y análisis posterior.


🧭 ¿Por dónde empezar?

Si nunca has participado en un concurso, empieza con lo básico:

🎓 1. Conceptos Fundamentales a Repasar

Antes de lanzarte a resolver problemas complejos, es importante dominar una serie de fundamentos que son comunes a prácticamente todos los ejercicios de programación competitiva. Esta sección cubre los conceptos esenciales que todo participante debe repasar, independientemente del lenguaje que utilice: C, Python o Java.

🧩 1.1 Entrada y salida eficiente

Aprende a leer múltiples valores en una línea, listas o matrices.

    • C: scanf, printf
    • Java: Scanner, BufferedReader, System.out
    • Python: input(), print(), sys.stdin

⚠️ En competición, el tiempo de lectura y escritura puede marcar la diferencia.

🧮 1.2 Tipos de datos y desbordamientos

Conoce los rangos de cada tipo:

    • C: int, long long
    • Java: int, long
    • Python: enteros sin límite práctico, pero más lentos

Aprende a trabajar con modulo para evitar desbordamientos (10⁹+7, 998244353).

🔁 1.3 Estructuras de control y bucles

Familiarízate con for, while, break, continue, return.

Evita errores comunes en los límites de los bucles (i <= n vs i < n).

🎯 1.4 Modelado de problemas

Extrae la estructura del problema a partir del enunciado. Aprende a traducir enunciados a estructuras como vectores, grafos o secuencias.

🔍 1.5 Simulación y lógica

Domina la simulación paso a paso de procesos (e.g., reglas condicionales, estados). Practica la construcción de soluciones “brutas” que luego puedas optimizar.

🔁 1.6 Recursividad y backtracking

Entiende cómo funcionan las llamadas recursivas y el uso del call stack. Aprende a generar combinaciones, permutaciones o recorrer árboles mediante backtracking.

💡 1.7 Análisis de complejidad

Estima cuántas operaciones realiza tu código usando notación Big-O: O(n), O(n log n), O(n²), etc.

🧠 1.8 Casos límite y depuración

No todos los errores son de código: casos con entrada vacía, mínima o máxima. Prueba tu solución con ejemplos personalizados (“casos malvados”).

🗂️ 2. Estructuras de Datos

📦 2.1 Estructuras básicas

🔹 Arrays / Listas / Vectores

Acceso directo por índice: O(1). Utilizadas para representar secuencias, tablas y vectores de valores.

    • C: int arr[N];
    • Java: int[] arr = new int[N];
    • Python: arr = [0] * N

🔹 Strings

Comparación, búsqueda, extracción de subcadenas. Métodos útiles: .substring(), .split(), .replace(), .count().

🔹 Stack y Queue

Stack (LIFO): push, pop → útil para paréntesis, DFS, backtracking.

Queue (FIFO): enqueue, dequeue → ideal para BFS y simulaciones.

🧮 3. Tipos de Algoritmos

🧱 3.1 Algoritmos clásicos

🔹 Búsqueda binaria

Ideal para encontrar valores en secuencias ordenadas o sobre dominios numéricos. Complejidad: O(log n).

🔹 Divide y vencerás

Divide el problema en subproblemas más pequeños que se resuelven recursivamente. Ej: merge sort, quicksort.

🔹 Fuerza bruta y generación de casos

Explora todas las combinaciones posibles. Útil con restricciones pequeñas (n <= 10).

🔹 Programación dinámica (DP)

Divide el problema en subproblemas que se resuelven una vez y se almacenan.

🔹 Algoritmos greedy

Toma decisiones locales óptimas esperando una solución global óptima. Ej. cambio de monedas, Huffman.


🧗 4. Cómo entrenar como un competidor

🌱 Si estás empezando:

💪 Si ya tienes algo de experiencia:

  • Participa en concursos online (Codeforces, AtCoder, etc.)
  • Simula sesiones de 2–3 horas resolviendo entre 3 y 5 problemas de distintas dificultades

📋 Independientemente de tu grado de conocimiento:

  • No dudes en consultar el cuadernillo de ejercicios que se plantearon en la primera edición del concurso a través del siguiente enlace o la sección Ediciones anteriores -> CodeBoost I

🤝 5. Trabaja en equipo (clave en CodeBoost)

Aunque muchas competiciones son individuales, CodeBoost es por equipos, y eso cambia la estrategia:

  • Divide roles: alguien codifica, otro prueba con datos…
  • Aprovecha fortalezas: uno puede dominar grafos y otro programación dinámica
  • Comunícate con claridad: evita conflictos y duplicación de esfuerzos

Practicar juntos fortalece la dinámica de equipo y mejora el rendimiento.


🔧 6. Herramientas y consejos técnicos

  • Usa Visual Studio Code, Sublime Text o entornos ligeros
  • Aprende a leer datos desde archivos
  • Automatiza la comparación de salidas con scripts

📚 7. Recursos avanzados

Cuando estés listo/a para profundizar más:


🧘 8. Mentalidad de competición

  • Empieza por el problema más fácil para asegurar puntos
  • Si te bloqueas, cambia de problema y vuelve después
  • Usa ejemplos manuales para validar tu idea antes de programar
  • Lee bien los enunciados: muchos errores vienen de interpretaciones incorrectas
  • Aprende más de tus errores que de tus aciertos

🎓 En resumen

Participar en CodeBoost no es solo competir, es aprender a pensar como un ingeniero. La programación competitiva te entrena para escribir código robusto, rápido y elegante, bajo presión.
No importa si eres principiante o avanzado: si te entrenas con constancia y curiosidad, verás resultados.

La plataforma dónde programarás durante el concurso será:

https://aulavirtual.etsisi.upm.es/desktops (Escritorio CodeBoost_Alumnos)