Sie sind auf Seite 1von 8

PROGRAMACION COMPETITIVA

El fin principal de las competencias de programación no es ganar una


competencia nacional, regional o mundial, el verdadero fin de las competencias de
programación es el de preparar a los estudiantes para que puedan aprender,
aplicar, investigar y desarrollar algoritmos que optimicen y proporcionen una
solución eficaz a problemas relativos a ciencias computacionales, aprender a
trabajar en equipo, aprender a trabajar bajo presión, fomentar el espíritu
competitivo en el estudiante

A medida del desarrollo del libro se explican tips (trucos) que ayudan en acortar el
tiempo de codificación.

1.1. TIPOS DE COMPETIDORES EN CONCURSOS DE PROGRAMACION

A continuación se plantea un problema que ayudara a identificar el tipo de


competidor que cada uno es:

Descripción del problema:

Deje que (x,y) sea la coordenada de la casa del estudiante en un plano 2d.
hay 2N estudiantes y queremos agrupar de par en par en N grupos. Di será
la distancia entre la casa de 2 estudiantes en el grupo i. Forme N grupos tal
que el costo ∑𝑁
𝑖=1 𝑑𝑖 sea el mínimo. La salida deberá ser el mínimo costo.

Ejemplo de entrada:

N=2, Coordenadas de las 2N=4 las casas son: (1,1) (8,6) (6,8) y (1,3).

Ejemplo de salida

Costo=4.83
A continuación se detallara los tipos de competidores, los cuales se encuentran
divididos entre 5 categorías: un competidor no competitivo (blurryone); un
competidor no competitivo A (blurryone); un competidor no competitivo B(give up);
(still)un competidor no competitivo C(Slow); Programador competitivo D;
Competidor muy competitivo.

1.2. IDENTIFICAR LOS TIPOS DE PROBLEMAS

En los campeonatos de la ACM los problemas que entran pueden ser:

No Categoría Frecuencia de aparición


1 Ad Hoc 1a2
2 Búsqueda completa 1a2
3 Divide y vencerás 0a1
4 Greedy 0a1
5 Programación dinámica 1 a 2 hasta 3
6 Grafos 1a2
7 Matemáticas 1a2
8 Procesamiento de 1
cadenas
9 Geometría computacional 1
10 Problemas difíciles 0a1

1.3. ANÁLISIS DE ALGORITMOS

La base para saber el como resolver un problema es analizar los datos de entrada
y en algunos casos los datos de salida, estoy identificaran el tipo de algoritmo a
usar, ejemplo: Mi algoritmo deberá ser O(1), o Mi algoritmo deberá ser O(N), y asi
viendo si deberá ser logaritmo y podrá ser exponencial y asi sucesivamente.
1.4. CONOZCA SU LENGUAJE DE PROGRAMACIÓN

Los programadores no deben elegir al azar que lenguaje de programación utilizar,


es decir: este lenguaje me gusta, entonces lo usare. Es una falla muy grande, sino
debe elegir el lenguaje que conozca y entienda mas. Conocer las bondades de
cada lenguaje es importante ya que algunos problemas pueden ser mas fáciles y
rápidos al reolverlo con un lenguaje y lento y difícil resolverlo con otro lenguaje de
programación, Lo aconsejable es manejar por lo menos 2 lenguajes de
programación, así para poder saber con cual lenguaje resolver que problema.

1.5. PRÁCTICA Y MÁS PRÁCTICA

Tal como en olimpiadas la práctica hace al maestro, es decir entrenar solo para el
campeonato de programación es lo que NO se debe hacer, sino entrenar por línea
y participar en lo campeonatos que las distintas paginas nos brindan, así como lo
son:

 UVA
 TOP CODER
 LIVE ARCHIVE
 OTROS

1.6. TRABAJO EN EQUIPO

Los siguientes consejos son importantes ya que la mayoría de los equipos no


trabaja en equipo.

 Resolver el problema en papel, en especial cuando un compañero esta


codificando.
 Si el problema da AC, entonces dejar a un lado el problema, si es WA
verificar la salida.
 Si un competidor no sabe que hacer, preparar datos de entrada y salida con
análisis de los casos mas difíciles para el compañero que esta codificando.
 Ser amigos en competencia!!, es decir conocer a los compañeros en la vida
real y así también en competencias pasadas, sea por línea o de la ACM
ICPC.

2. ESTRUCTURAS DE DATOS

Los distintos lenguajes de programación usan datos primitivos para todos sus
entornos de trabajo tal como lo son los enteros, decimales, cadenas, booleanos y
otros.

Tenemos tanto datos que serán variables y constantes (su valor no cambia a
través del tiempo), donde podemos mencionar que los valores variables son las
más utilizadas sin duda alguna.

En el presente capitulo se hace una introducción a las estructuras de datos


básicas. La intención de este capitulo es orientar en el uso de estructuras que
vienen implementadas en los lenguajes de programación. No se trata de introducir
los conceptos que corresponden a los cursos de estructura de datos, sino más
bien, de reutilizar las herramientas provistas y aprender a escoger la estructura de
datos adecuada para afrontar un cierto tipo de problema.

Las estructuras que proporcionan C++ y Java se pueden clasificar en estructuras


estáticas y dinámicas, las estructuras estáticos permiten una ejecución más rápida
del código y son de tamaño fijo en cambio las estructuras dinámicas permiten
cambiar su tamaño a cambio de un tiempo procesamiento adicional.
3. PARADIGMAS PARA RESOLVER PROBLEMAS

A continuación se detallaran los paradigmas mas importantes utilizados en la


competencia de la ACM ICPC tal como lo son: Greedy; Búsqueda completa;
Programación dinámica y Divide y vencerás.

3.1. BÚSQUEDA COMPLETA

También conocida como BackTracking, es una búsqueda de todas las soluciones


posibles dentro de todo el espacio de soluciones, es decir, buscar todo de todo,
encontrando las sub soluciones, dependiendo del algoritmo utilizado nuestra
complejidad puede ser Exponencial o factorial, lo obio es recomendado que
deberá ser factorial. La dificultad se basa en que la cantidad de datos que podrá
hacer la búsqueda deberá ser menor a 20 y en la mayoría de los casos menor a
10 ya que el problema puede generar un TLE.

Conejos:

Utilizar estructura de datos adecuadas.

Optimice sus líneas de código

3.2. DIVIDE Y VENCERÁS

Trata sobre hacer un ejercicio mas fácil dividiendo este en partes mas pequeñas:

 Dividir en problema en sub problemas, dividiendo en 2 o casi 2.


 Encontrar las sub soluciones y tratar estas
 Combinar las sub soluciones para tratar el problema mas grande.
3.2.1. BÚSQUEDA BINARIA

El uso de búsqueda binaria es escencial para algunos problemas, ya que realiza la


búsqueda en tiempo logarítmico es decir: si n es el espacio de soluciones, busca
nuestra solución en log n. Este es un principio de divide y vencerás.

3.2.2. BÚSQUEDA BINARIA ES LA RESPUESTA

En algunos problemas tan solo utilizar búsqueda binaria queda resuelto, estos
problemas son generalmente en los que los datos se encuentran ordenados y
debemos buscar algún dato entre todo el espacio de datos.

3.3. GREEDY

Se llama algoritmo greedy si es que en cada paso de la solución del problema se


escoje la solución mas probable o la mas optima, en algunos casos greedy
funciona y muy rápido, pero en algunos casos para llegar a la mejor solución no
siempre se elige las sub soluciones mas probables, se debe serguir dos reglas
para que un algoritmo greedy funcione:

 Se debe utilizar estructura de datos adecuadas


 El problema tiene una característica greedy, al analizar el problema
notamos que se debe elegir la solución mas probable o la mas optima.

3.4. PROGRAMACIÓN DINÁMICA

DP o programaciondinamica puede ser asumida como un inteligente y rápido


backtracking, en el cual no se repite un estado (lo que no es en backtracking),
usualmente se usa en problemas de optimización, de conteo, de minimización y
maximización.
Existen distintas técnicas de programación dinámica entre las mas conocidas
tenemos:

 Bottom Up
 Top Down
 Longest incresing sub sequence o LIS

4. PROCESAMIENTO DE CADENAS

Una cadena de caracteres es cualquier secuencia de elementos. Las cadenas


aparecen en el proceso de textos en lenguaje natural, códigos, diccionarios,
diferentes tipos de secuenciamiento.

Este capitulo presenta algoritmos para las dos clases de problemas relacionados
con la manipulación de cadenas. Los problemas de la primera clase abarcan los
algoritmos para el emparejamiento de cadenas, búsqueda exacta y aproximada.

Los problemas de la segunda clase están relacionados con los algoritmos para la
compresión de cadenas, en ambos casos esto puede realizarse a través de los
diferentes paradigmas de resolución de problemas.

5. MATEMÁTICAS

Los problemas de competencia en su mayoría requieren el conocimiento amplio y


fuerte en matemáticas, ejemplo: criba de eratostenes, coeficientes binomiales, etc.

5.1. MATEMÁTICAS AD HOC

Un problema es considerado sencillo Ad Hoc, si tan solo utilizando un algoritmo


matemático es resuelto:

 Encontrar la formula
 Secuencia de números
 Logaritmos, exponenciación o potencias
 Polinomiales
 Variaciones entre base de los números
 Tan solo Ad Hoc

Conocer el lenguaje se explico que es muy necesario, las bondades de JAVA en el


uso de Biginteger o BigDecimal es una gran ayuda en el momento de codificar.

En matemáticas se debe saber GCD, aritmética, conversión de números,


combinatoria, Fibonacci, números primos, coeficientes binomiales, etc.

6. GEOMETRÍA COMPUTACIONAL

Geometia computacional es la aplicación de la geometría por medio de un


ordenador, es decir codificar un problema de geometría.

En las competencias de programación de 1 a 2 ejercicios son de geometría


computacional, en algunos casos la descripción puede ser complicada pero con un
simple algoritmo geométrico se resuelve, y en otros el ejercicios mas difícil es el
de geometría computacional.

Se debe conocer y codificar nuestras propias librerías en el caso de java nos


brinda librerías para tratar algunos: líneas, polígonos, etc. Pero no siempre se
adecuan a lo que uno necesita entonces se debe codificar estos:

 Puntos 1D, 2D
 Segmentos 1D, 2D hasta algunas veces 3D
 Líneas 1D, 2D hasta algunas veces 3D
 Círculos 1D, 2D hasta algunas veces 3D
 Triángulos 1D, 2D hasta algunas veces 3D
 Cuadriláteros 1D, 2D

Das könnte Ihnen auch gefallen