Introducción a la programación competitiva
Concursos de programación
Un concurso de programación suele durar varias horas y consiste en un conjunto de problemas. Estos problemas no son problemas abiertos: ya fueron resueltos por quienes los escribieron y probaron, y están diseñados para resolverse en el tiempo corto de un contest. En general, cada problema de programación competitiva se resuelve con un proceso de dos pasos:
- idear el algoritmo, lo que involucra habilidad para resolver problemas e intuición
- implementar el algoritmo, lo que requiere habilidad de programación para traducir el algoritmo a código que funcione.
Para cada problema, enviás el código completo a un grader, que compara las respuestas calculadas por tu programa contra un conjunto de casos de prueba predeterminados. Para cada problema te dan un límite de tiempo (normalmente 2 segundos) y un límite de memoria (normalmente 256 megabytes ) que tu programa debe respetar.
Si tenés experiencia en desarrollo de software, tené en cuenta que la programación competitiva es bastante distinta: el objetivo es escribir programas que calculen la respuesta correcta, corran rápido y se puedan implementar rápido. Nótese que en ningún lado se menciona la mantenibilidad del código. No hace falta documentar el código porque solo tiene que ser legible para vos durante el contest. Dicho esto, conviene mantener un mínimo de legibilidad para no perder de vista qué está pasando.
| Fuente | Recurso | Notas |
|---|---|---|
| William Lin | Video - What is Competitive Programming? | video mostrado arriba |
| Kamil Debowski | Video - Interview with a Competitive Programmer | |
| CPH | 1 - Introduction | algoritmos y concursos de programación |
| IUSACO | 1 - The Beginning | programación competitiva, contests |
| PAPS1 | 1 - Algorithms & Problems | ejemplos de algoritmos |
Acá hay una tarea similar a la que se resolvió en el video de Kamil:
| Hecho | Fuente | Nombre | Dificultad | Tags | Solución |
|---|---|---|---|---|---|
| Kattis | Basketball One on One | Muy fácil | — |
Solución - Basketball One-on-One
Simplemente imprimí el anteúltimo carácter de la entrada.
#include <iostream>
using namespace std;
int main() {
string s;
cin >> s;
cout << s[s.size() - 2];
}print(input()[-2])import java.util.Scanner;
public class basketballoneonone {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
System.out.println(s.charAt(s.length() - 2));
}
}USACO
La USA Computing Olympiad es un concurso nacional de programación que ocurre cuatro veces al año, con contests en diciembre, enero, febrero y US Open (marzo). Los contests regulares duran cuatro horas, y el US Open dura cinco. Cada contest tiene tres problemas. Las soluciones se evalúan y puntúan contra un conjunto de casos de prueba predeterminados. El puntaje es sobre 1000 puntos, y cada problema pesa lo mismo (~333 puntos). Hay cuatro divisiones: Bronce, Plata, Oro y Platino. Después de cada contest, los estudiantes que alcancen el corte de promoción (que depende del contest) compiten en la siguiente división en los contests futuros.
Ver las USACO FAQ para más información.