miércoles, 3 de diciembre de 2008

DNA Sequences

Estuve toda la tarde contra 4213, "DNA Sequences". ¡Voy a intentar terminar todos los del pack cueste lo que me cueste!

En especial, este es el problema que me dió una buena combinación de errores: Compile Error, Time Limit Exceeded, Runtime Error y Wrong Answer. Costó pero ahora al menos me dio WA. La mayoria de las otras corridas en el juez me daba TLE.

El problema es una variante del clásico Longest Common Subsequence Problem. La primer versión que intenté fué una recursiva usando Memoization en una matriz, y era muy lenta. La siguiente version era iterativa, usando una matriz y dos bucles anidados.

La matriz al principio la implementé como un vector de vector en C++, (vector<vector< int > >), pero el tiempo de acceso deja mucho que desear. Lo cambié a un vector y usando un poco de aritmética (ptr = y * width + x) logré mejorar bastante el tiempo de acceso.

La segunda optimización fue eliminar todas las llamadas a todas las funciones, y usar variables locales temporales. Métodos y funciones como string::c_str(), string::length() y vector::size() compilando con gcc sin optimización de código suelen ser muy lentas.

El resultado: ¡de 30 segundos de ejecución pasé a tener 18, y de tener un TLE pasé a tener WA!

En el caso de la versión recursiva, intenté hacer un test usando el mismo juego de datos para ver cuánto tardaba, pero lo corté a los 7 minutos.

Probé con una version mas chica de datos de prueba y, donde la versión recursiva tarda 40 segundos, la interativa con todas las optimizaciones anteriores tarda 0.5 segundos.

En ningún caso estoy usando la opción -O (de optimizaciones de compilación) de gcc, ya que no tengo muy en claro si el juez la usa o no. De usarla, la versión iterativa en vez de tardar 18 segundos, tarda 8.

martes, 2 de diciembre de 2008

Electricity y Feynman

Los problemas 4214 y 4215 son bastante sencillos. En Electricity lo más complicado es armar la tabla de la cantidad de días en un mes (o si usás Java saber como usar la clase Calendar) y poder manejar fechas.

En el caso de Feynman (que por cierto me dieron curiosidad los titulos de los libros, voy a ver si los puedo leer en algun momento) armé una tabla de todos los numeros, total son pocos. Lamentablemente quedé en el puesto 143 ya que lo resolví en tiempo casi mínimo: 0.002 :(

Candy (ii)

Candy: Accepted.

¡Habia un buffer overflow! me agarró desprevenido :( Por suerte tengo valgrind siempre a mano.

Según el juez, el programa tardó 0.871 segundos. No se me ocurre qué optimización poderosa pueda hacerse al algoritmo. La última que hice fue cambiar la estructura temporal de un arbol a un vector para mejorar el tiempo de acceso.

Capaz se pueda eliminar la recursión y hacerlo iterativo, pero hace rato que estoy pensando cómo hacerlo y no lo termino de cerrar.

Candy

Estoy con 4212 a.k.a. "Candy", y me tira Wrong Answer. Es increíble las pocas líneas de código que tiene la última versión que hice, estoy debajo de las 65. Solía haber como 200 :P

Comentarios

Me puse un rato a hacer 3930, aka "Drop The Triples", y Luego de varios intentos decidí eliminar todos los comentarios del código. El resultado:

Drop The Triples: Accepted.

Nunca usar comentarios con //.

lunes, 1 de diciembre de 2008

Hola, Blogspot

No duré ni un día en Wordpress.com, no me dejan editar los CSS a menos que yo mismo hostee el blog. Algo que por el momento no está en mis planes.

En fin. Vengo de rendir de la facu y me hicieron pomada. Hoy no voy a poder dedicarle tampoco al Drop The Triples. Lo dejo para esta semana.