Antes de entrar de lleno, una pequeña introducción para saber de que va la cosa:
Cada año se celebran las Olimpiadas de programación de la ACM (Association for Computing Machinery), las cuales designan a los mejores programadores universitarios del planeta. Para acceder a la fase final hay que pasar una fase regional española y luego una fase europea. De momento yo ya he pasado la fase regional de mi universidad y a final de año iré a Portugal a la fase europea.
Normalmente los problemas que ponen son mezcla de ingenio mezcla de implementar algún algoritmo conocido adaptándolo para el problema (Floyd-Washall, coloración de grafos, programación dinámica...).
Pues bien, para entrenar para la competición, tienen una página web con una gran cantidad de problemas de diferente tipo y un juez online que comprueba si el programa que escribas para un determinado problema es correcto o no.
Los lenguajes que se pueden utilizar para resolver problemas son C, C++, Pascal y Java. Yo recomiendo C o C++ ya que Java tiene bastantes limitaciones impuestas por la organización y el compilador de Java que usan creo que no acepta todas las versiones de Java, aunque de esto no estoy muy seguro.
Lo que propongo es cada semana elegir un problema y ver cuantos sois capaces de resolverlo. El enunciado de los programas está en inglés, así que más vale que tengáis un buen nivel de inglés.
INSTRUCCIONES PARA QUIEN QUIERA PARTICIPAR:
1º Registrarse en la web: http://acm.uva.es/problemset/registerjudge.php?acc=1
En el campo "Your Name & Surname" sugeriría que pusierais por ejemplo además de vuestro nombre el tag [MVida] para poder realizar búsquedas de los usuarios que se registren. MARCAR LA OPCION "You want to receive the replies from the Online Judge to: Always to the E-Mail address specified at the top" y poned un mail válido pq así el juez os mandara si un programa que escribais es correcto o no.
2º Una vez que CREAIS que vuestro programa resuelve un problema propuesto tendreis que entrar en esta página: http://acm.uva.es/problemset/submit.php y rellenar los datos (nº del programa, tu nº identificador que te darán al registrarte, seleccionar el lenguaje de programación elegido y enviar el código fuente o copiarlo en el recuadro de texto).
3º Comprobar el mail ya que ahi te enviarán si el programa que has enviado produce una solución correcta, incorrecta, si el tiempo de ejecución es demasiado largo, si te pasas de memoria utilizada...
4º Es muy importante respetar el formato de entrada y salida que te explican en el enunciado de cada problema ya que leer mal los datos o imprimirlos de otra manera a como la piden da lugar a un resultado incorrecto aunque el programa que hayas escrito sea correcto. TENED EN CUENTA que cuando tu envias el programa ellos lo compilan y lo prueban redirigiendole un archivo donde tienen todos los tests que quieren hacerle, de modo que teneis que escribir el programa pensando que se le ha redirigido un archivo de entrada con el formato que ellos te indican en el enunciado.
En fin es muy facil cuando se le coje el truco. En el siguiente post pondré el primer problema elegido...
---------------------------------------> EJEMPLO <---------------------------------------
1er PROBLEMA:
Nº: 10055
Nombre: Hashmat the Brave Warrior
Enunciado: http://acm.uva.es/p/v100/10055.html
Como podeis leer, siempre ponen una pequeña introducción para darle un poco de sentido al problema, algunas veces no sirve para nada y otras veces da alguna pista.
En este caso se trata de un guerrero que solo ataca si sus tropas son mayores que las de otro ejercito. Como INPUT DE EJEMPLO te dicen que habrá una serie de lineas, cada una con 2 enteros que indica el nº de hombres de cada ejercito y como OUTPUT por cada una de estas lineas hay que imprimir un nº que es la diferencia (positiva) de hombres que existe entre ellos.
¿Parece facil no? Pues para desanimar dire que no lo es tanto y de los 46146 que han enviado solución, solo unos 13000 y pico es correcta. Aún así este es de los secillos
¡A programar!
Por ser el primero y como cuesta al principio hacerse un poco con la entrada/salida voy a poner un ejemplo de como seria la de este programa:
int main() {
____variables
____while(scanf(aqui lo que penseis\n) != EOF) {
________buscar solucion para la pareja de nº leida
________printf(lo que penseis\n)
____}
}
Pensad que con el scanf estais leyendo del fichero con el formato que ellos imponen y no de la entrada estandar ya que ellos la redirigen con el fichero de test que tienen.
Por cierto, que un programa que hagais calcule la solucion correcta para la entrada de ejemplo que ellos dan no significa que funcione para todos los casos...
Una ultima cosa, podeis declarar funciones auxiliares pero todo el código fuente debe estar en un único archivo.