Cómo resolver los problemas de ProgramaMe

Documentos relacionados
LA ESTRUCTURA DE DATOS PILA EN JAVA. CLASE STACK DEL API JAVA. EJEMPLO Y EJERCICIOS RESUELTOS. (CU00923C)

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

MANUAL DE RUBY (PARTE I) Luis José Sánchez González

Tema 2 Introducción a la Programación en C.

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Tema: Introducción al IDE de Microsoft Visual C#.

TECNICO SUPERIOR EN INFORMÁTICA EMPRESARIAL MÓDULO INTRUCCIONAL

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

Tema 7.- Fundamentos de la Programación Orientada a Objetos

Fundamentos de programación

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

Se distinguen tres métodos algebraicos de resolución de sistemas:

Ámbito Científico-tecnológico Módulo III Bloque 3 Unidad 4 Fácil, fácil, fácil. Pon una ecuación en tu vida

República Bolivariana de Venezuela Aldea Universitaria Liceo Fray Pedro de Agreda. Lenguaje C++ Contadores y Acumuladores

LABORATORIO 3 ESTRUCTURAS REPETITIVAS WHILE / DO WHILE

UNIVERSIDAD DE NARIÑO DEPARTAMENTO DE INGENIERIA DE SISTEMAS SEMILLERO DE PROGRAMACION COMPETITIVA UDENAR

Instrucciones de control

Asociación Gaditana de Jubilados Docentes Informática Básica Cap 5. Curso de informática básica: Como descargar e instalar programas

Introducción a la programación del robot moway

Clase adicional 2. Estructuras básicas de control. Temas

Estadística para investigadores: todo lo que siempre quiso saber y nunca se atrevió a preguntar

Ejercicios de Programación Tema 7. Programación Orientada a Objetos

Introducción a C++ y Code::Blocks

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

fundamentos de programación (unidad 4) programación estructurada en Java

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

2. Ecuaciones de primer grado: (sencillas, con paréntesis, con denominadores).

Prueba Protocolo de Programación I

Algoritmos y programas. Algoritmos y Estructuras de Datos I

A continuación se presenta la información de la altura promedio para el año de 1998 en Holanda de hombres y mujeres jóvenes.

2007/ PROGRAMACIÓN. Tipo: TRO Curso: 1 Semestre: AB CREDITOS Totales TA TS AT AP PA OBJETIVOS. 1.-Introducción.

Prof. Dr. Paul Bustamante

TEMA. Resolución de problemas. [2.1] Cómo estudiar este tema? [2.2] Definición de problema. [2.3] Tipología de problema

Estatutos de Control C# Estatutos de Decisión (Selección)

Ejercicio resuelto: variante para ordenar una serie de números. Pseudocódigo y diagrama de flujo. (CU00262A)

1. dejar a una lado de la igualdad la expresión que contenga una raíz.

Normas Estatales Fundamentales Comunes

PHP: Lenguaje de programación

Hoja de ejercicios del Tema 3

DESCRIPCIÓN ESPECÍFICA NÚCLEO: COMERCIO Y SERVICIOS SUBSECTOR: INFORMÁTICA

CREATIVIDAD E INNOVACION.

Algoritmos glotones. mat-151

Editor de código Visual Basic. Lista de miembros automática, sugerencias de sintaxis, autocompletado y otras opciones. (CU00313A)

RESOLUCIÓN INTERACTIVA DEL SIMPLEX

UNIDAD 6.- PROGRAMACIÓN LINEAL

ANALISIS DE LOS METODOS DE TRANSPORTE EN LA LOCALIZACION DE EMPRESAS Y SU APLICACION EN LA INCERTIDUMBRE

Aprende a contar ángulos dividiendo una circunferencia, realiza operaciones y busca patrones de repetición. Afna tu puntería, gira y dispara!

Actividad de Evaluación Brandon Emmanuelle Cuevas Rangel GPO: 303 Carrera: Informática 3er Semestre Joel Rocha Barocio Cienega de Flores N.L.

Capítulo 7 OPERADORES Y EXPRESIONES. Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C"

media = ( temp0 + temp1 + temp2 + temp3 + temp temp23 ) / 24; printf( "\nla temperatura media es %f\n", media );

TEMA 6. Sistemas de dos Ecuaciones de Primer grado con dos Incógnitas

QUÉ ES UNA CLASE JAVA? ATRIBUTOS (PROPIEDADES O CAMPOS), CONSTRUCTOR Y MÉTODOS. (CU00623B)

$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos

Cuánto dura un partido de tenis? (Aplicación estocástica)

Estructuras de Control

Java desde Consola Utilizando Java sin Path

Cómo configurar formatos Wiegand personalizados

Definición de Memoria

Los constructores son funciones miembro especiales que sirven para inicializar un objeto de una determinada clase al mismo tiempo que se declara.

Una ecuación puede tener ninguna, una o varias soluciones. Por ejemplo: 5x 9 = 1 es una ecuación con una incógnita con una solución, x = 2

Introducción a las sentencias de control

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

I.E.S. CUADERNO Nº 5 NOMBRE: FECHA: / / Inecuaciones. Resolver inecuaciones de primer y segundo grado con una incógnita.

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO

Estructuras de control

Guía práctica de estudio 03: Algoritmos

Sesión de P r i m a r i a

PROBLEMA 1. Considere el siguiente problema de programación lineal:

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Ruta más Corta con una sóla Fuente de Inicio (Single-Source Shortest Paths) DR. JESÚS A. GONZÁLEZ BERNAL CIENCIAS COMPUTACIONALES INAOE

INFORME DE RESULTADOS DEL ESTUDIO DE SATISFACCIÓN DE USUARIOS UNIVERSIDAD DE ALMERÍA Acción Social

ALGORITMOS, ESTRUCTURAS Y PROGRAMACION

Estructuras de Repetición (Repita para)

Sockets. Los sockets son un mecanismo de comunicación entre procesos que se utiliza en Internet.

COMUNICACIÓN ENTRE EL CLIENTE Y SERVIDOR SIN PHP Y CON PHP. INTÉRPRETE PHP Y GESTOR DE BASES DE DATOS (CU00804B)

SESIÓN 14 DERIVADAS SUCESIVAS DE UNA FUNCION, DE MÁXIMOS Y MÍNIMOS Y LA CONCAVIDAD DE UNA CURVA APLICANDO EL CRITERIO DE LA SEGUNDA DERIVADA

Prueba, caso de prueba, defecto, falla, error, verificación, validación.

Programación de Computadores 4 Iteraciones y Decisiones. Prof. Javier Cañas. Universidad Técnica Federico Santa María Departamento de Informática

1.- Para cada uno de los siguientes problemas escribir el diagrama de flujo y el pseudocódigo de un programa que lo resuelva:

TEST DE RAZONAMIENTO NUMÉRICO. Consejos generales

3.1. Administración de la medición y de la información estratégica:

Ángulos complementarios Un par de ángulos son complementarios si la suma resultante de sus medidas es.

Introducción. Curso de Middleware. Práctica 6. 1 de 9

SESION 12 LA DISTRIBUCIÓN BINOMIAL

Funciones básicas del depurador

Java para no Programadores

MANUAL DE INICIO DE CURSO EN PLATAFORMA E-LEARNING

En este artículo vamos a conocer los tipos de datos que podemos manejar programando en C.

Conocimientos previos

Unidad 2: Ecuaciones, inecuaciones y sistemas.

4.- Leer tres números y escribirlos en orden decreciente

TIPOS DE CAMPOS Cada Sistema de Base de Datos posee tipos de campos que pueden ser similares o diferentes.

IRISPen Air 7. Guía rápida del usuario. (ios)

Transcripción:

Cómo resolver los problemas de ProgramaMe Universidad Complutense de Madrid I.E.S. Antonio de Nebrija (Móstoles) http://www.programa-me.com 1

Cómo resolver los problemas de ProgramaMe 1 Por dónde empezar? Cuando comienza el concurso se da a los participantes el enunciado de un número determinado de problemas (entre 8 y 10) de distinta dificultad. La competición consiste en intentar resolver el mayor número de problemas en el menor tiempo posible. Ganará el equipo que tenga más problemas resueltos correctamente cuando termine el tiempo. Es importante destacar que en caso de empate (dos o más equipos han resuelto el mismo número de problemas) se utiliza el tiempo total para desempatar (también aquí hay que sumar el tiempo por las penalizaciones de envíos incorrectos). Eso se traduce en que es preferible resolver los problemas cuanto antes. Teniendo en cuenta esto, los equipos experimentados en concursos de este tipo suelen comenzar repartiéndose los enunciados de los ejercicios para leerselos rápidamente y evaluar de forma rápida cuáles son más fáciles y cuáles son más difíciles. Tras este periodo inicial de lectura, y una vez que se tienen más o menos ordenados los problemas por orden de dificultad, se empieza por el más fácil. De esta forma se pretende tener ejercicios resueltos lo antes posible para, en caso de empate, conseguir la victoria. 2 Qué hacer durante el concurso? (Consejos para las convocatorias presenciales) Durante los concursos presenciales sólo hay un ordenador por equipo, por lo que sólo una persona puede estar tecleando. Es habitual, no obstante, que al menos dos personas estén pensando y programando el ejercicio en cuestión, para evitar errores. Mientras tanto, el otro miembro del equipo puede dedicarse a escribir manualmente casos de prueba. En general, las soluciones planteadas deberían probarse con más casos de los mostrados como ejemplo en los enunciados. La creación de casos de prueba no es una tarea trivial, pero es muy importante si se quieren evitar envíos incorrectos. Un problema que da el resultado esperado para el ejemplo del enunciado no necesariamente es una solución correcta. Un miembro del equipo puede dedicarse a plantear casos de prueba adicionales (y sus soluciones, obtenidas manualmente) que busquen los límites en la entrada, por ejemplo, o las esquinas más oscuras de la solución. Si se considera que la escritura de casos de prueba no es necesaria, otra forma de aprovechar el tiempo es que el tercer integrante del equipo vaya pensando en cómo 2

resolver otro problema. Según el caso, podría incluso escribir en papel el código fuente, para reducir el tiempo necesario para probarlo una vez que el ordenador quede libre. Tened en cuenta que, tras enviar la solución de un problema, la respuesta de los jueces puede tardar algún tiempo. Mientras tanto el ordenador queda libre y esa tercera persona que estaba pensando en el otro ejercicio puede comenzar a resolverlo (con la ayuda de otro compañero). Es muy normal durante el concurso tener dos o tres problemas abiertos a medio programar. Por ejemplo, si la respuesta de los jueces es negativa y hay algún error, uno de los miembros del equipo puede dedicarse a intentar encontrar el fallo (sobre el papel) mientras los otros dos siguen adelante con la programación de otro ejercicio. 3 Qué hacer durante el concurso? (Consejos para las convocatorias on-line) En las convocatorias on-line del concurso, la limitación de un ordenador por equipo no existe. Por tanto, la estrategia más directa para optimizar el tiempo consiste en dividirse los problemas, y que cada miembro del equipo trate de solucionar aquellos de los que se haya hecho cargo. Dado que, como en los concursos presenciales, se utiliza como criterio de desempate en la clasificación el tiempo total necesario para resolver los problemas, es interesante resolver los problemas lo antes posible. Por tanto, una distribución de los problemas entre los participantes debería intentar que todos reciban al menos un problema fácil, para resolverlos en paralelo y entregarlos antes. No obstante, el reparto de los problemas deberá adaptarse a la idiosincrasia de cada equipo, y a las habilidades concretas de sus integrantes. Por ejemplo, si sólo uno de los participantes conoce el concepto de recursión y se identifica que en el concurso hay algún problema de este tipo, debería ser asignado desde el primer momento a quién más probabilidades tiene de saber resolverlo. Por último, aunque cada participante podría estar usando su propio ordenador, eso no significa que tenga que hacerlo siempre. La colaboración entre los miembros de un equipo a la hora de resolver problemas y, sobre todo, buscar errores puede ser de una gran ayuda. Un pequeño retraso en la resolución de un problema para ayudar a un compañero de equipo puede resultar muy beneficioso al final. 4 Cómo son los problemas Como se describe más adelante, los problemas a resolver durante el concurso, son siempre aplicaciones de consola, recibiendo los datos de ejecución a través de la entrada estándar, y enviando los resultados a la salida estándar. A nivel de estructuras de programación, los problemas pueden incluir, entre otras cosas, tipos básicos y compuestos, expresiones, saltos condicionales, bucles, estructuras de datos típicas y recursión. Se intenta que ninguno de los lenguajes permitidos en el 3

concurso aporte una ventaja significativa en el tiempo de resolución de los problemas que se plantean. El espíritu de las ediciones presenciales y on-line de ProgramaMe es diferente, y por tanto también lo son sus problemas. Si se revisan los cuadernillos de los problemas de las convocatorias presenciales anteriores, se puede comprobar que muchos de los enunciados están ambientados, de modo que se dota al ejercicio de un contexto que le concede cierta gracia. Debajo de esa ambientación, hay un problema de programación de diversa naturaleza. Algunos ejercicios centran su dificultad en los aspectos meramente técnicos de la programación (por ejemplo, recorridos de arrays bidimensionales). Otros, sin embargo, tienen soluciones muy sencillas de programar, pero que necesitan una cierta reflexión para llegar al método de resolverlos. Estos ejercicios suelen ser idóneos para que los miembros del equipos que no tienen acceso al ordenador aprovechen el tiempo avanzando en ellos. Naturalmente, hay también ejercicios que caen en ambos grupos, que suelen ser los más difíciles. Debido a sus características particulares, las ediciones on-line del concurso tienden a tener más problemas sencillos de programación rápida. Se persigue más bien comprobar las destrezas de programación rápida que la disección analítica de los enunciados. Nota: es importante resaltar el hecho de que el juez automático exige que todos los programas acaben con éxito (resultado de ejecución 0). Esto supone que en las soluciones programadas en C o C++ es importante acabar la función main con un return 0. En otro caso, el juez dará como veredicto un error de ejecución. 5 Entrada de datos Todos los problemas utilizan el mismo esquema: dado un caso de entrada hay que escribir algo sobre él. Para que se pueda probar con certeza que el programa funciona, éste tendrá que ser probado con numerosos casos de entrada, y dar la respuesta correcta para todos ellos. Para hacerlo, hay tres alternativas o estilos de entrada : 1. Al principio de la ejecución, el programa recibe el número de casos de prueba que se utilizan. 2. El programa va leyendo casos de prueba hasta que se encuentra con un caso de prueba especial. 3. El programa va leyendo casos de prueba hasta que se alcanza el final de la entrada (no quedan más datos). Dependiendo de si es una u otra alternativa el esquema general del programa será distinto. Como consejo recomendamos que se utilice una función/método que se encargue de resolver un caso de prueba y que sea llamado desde el programa principal tantas veces como sea necesario. 4

Como ejemplo, una solución en C++ de un problema que comienza con el número de casos de prueba (primer tipo) podría tener el siguiente esquema: #i n c l u d e <iostream > using namespace std ; // Resuelve un caso de prueba, leyendo de l a entrada l a // c o n f i g u r a c i o n, y e s c r i b i e n d o l a r e s p u e s t a. void casodeprueba ( ) { //... i n t numcasos ; c i n >> numcasos ; f o r ( i n t i = 0 ; i < numcasos ; i++) casodeprueba ( ) ; Si la entrada del problema en vez de empezar con el número de casos de prueba termina con un caso de prueba especial, podemos utilizar el siguiente: #i n c l u d e <iostream > using namespace std ; // Resuelve un caso de prueba, leyendo de l a entrada l a // c o n f i g u r a c i o n, y e s c r i b i e n d o l a r e s p u e s t a. Si e l caso // de prueba l e i d o es e l que marca e l f i n a l de l a e j e c u c i o n, // l a f u n c i o n devuelve f a l s e para i n d i c a r a l main que hay // que terminar. bool casodeprueba ( ) { //... // Leemos de l a entrada c i n >>... i f ( c a s o e s p e c i a l ) r eturn f a l s e ; //... resolvemos... return true ; 5

bool s e g u i r ; do { s e g u i r = casodeprueba ( ) ; while ( s e g u i r ) ; // Tambien se puede resumir en una unica l i n e a : // while ( casodeprueba ( ) ) ; La última posibilidad en la que el final no viene marcado con un caso de prueba especial sino con la terminación de la entrada utiliza un esquema similar al anterior. La única diferencia consiste en que la función casodeprueba comprueba si se ha llegado al final para devolver false. En las siguientes secciones, planteamos un hipotético problema con los tres estilos de entrada, y lo resolvemos en los tres lenguajes de programación admitidos en el concusro. 6 Ejemplo de ejercicio con casos de prueba limitados Imaginemos que nos piden un problema tan simple como éste 1 : Entrada La primera línea de la entrada contendrá el número de casos de prueba que el programa debe leer. A continuación vendrá uno detraś de otro todos esos casos. Cada uno de ellos consiste en una única línea con un número entero. Salida Para cada caso de prueba el programa escribirá PAR si el caso de prueba es un número par y escribirá IMPAR si el número es impar. Las soluciones en C, C++ y Java aparecen a continuación. Como se ve, en todas ellas se sigue el mismo esquema descrito en la sección anterior. // SOLUCION EN C #i n c l u d e <s t d i o. h> // Resuelve un caso de prueba, leyendo de l a entrada l a // c o n f i g u r a c i o n, y e s c r i b i e n d o l a r e s p u e s t a. 1 Los problemas del concurso, especialmente en su edición presencial, serán más complicados. Éste lo utilizamos como ejemplo para ver cómo sería el esquema de la solución. 6

void casodeprueba ( ) { i n t num ; s c a n f ( %d\n, &num ) ; i f ( (num % 2) == 0) p r i n t f ( PAR\n ) ; p r i n t f ( IMPAR\n ) ; i n t numcasos ; i n t i ; s c a n f ( %d\n, &numcasos ) ; f o r ( i = 0 ; i < numcasos ; i++) casodeprueba ( ) ; // SOLUCION EN C++ #i n c l u d e <iostream > using namespace std ; // Resuelve un caso de prueba, leyendo de l a entrada l a // c o n f i g u r a c i o n, y e s c r i b i e n d o l a r e s p u e s t a. void casodeprueba ( ) { i n t num ; c i n >> num ; i f ( (num % 2) == 0) cout << PAR\n ; cout << IMPAR\n ; 7

i n t numcasos ; c i n >> numcasos ; f o r ( i n t i = 0 ; i < numcasos ; i++) casodeprueba ( ) ; // SOLUCION EN Java c l a s s s o l u t i o n { s t a t i c java. u t i l. Scanner in ; p u b l i c s t a t i c void casodeprueba ( ) { i n t n ; n = in. nextint ( ) ; i f ( ( n % 2) == 0) System. out. p r i n t l n ( PAR ) ; System. out. p r i n t l n ( IMPAR ) ; p u b l i c s t a t i c void main ( S t r i n g args [ ] ) { in = new java. u t i l. Scanner ( System. in ) ; i n t numcasos ; numcasos = in. nextint ( ) ; f o r ( i n t i = 0 ; i < numcasos ; i++) casodeprueba ( ) ; 7 Ejemplo de ejercicio con casos de prueba ilimitados acotados por caso de prueba especial Los jueces podrían haber puesto el mismo problema pero cambiando el formato de los casos de entrada. En ese caso el enunciado tendría la forma siguiente: 8

Entrada La entrada consistirá en un número indeterminado de casos de prueba. Cada caso de prueba consistirá en un número entero. Los casos de prueba terminarán con el número -1, que marcará el final de la entrada y que no será procesado. Salida Para cada caso de prueba el programa escribirá PAR si el caso de prueba es un número par y escribirá IMPAR si el número es impar. Las soluciones en C, C++ y Java aparecen a continuación. Como se ve, en todas ellas se sigue el mismo esquema descrito más arriba en el documento. // SOLUCION EN C #i n c l u d e <s t d i o. h> i n t casodeprueba ( ) { i n t num ; s c a n f ( %d\n, &num ) ; i f (num == 1) // Marca de f i n de entrada r eturn 0 ; i f ( (num % 2) == 0) p r i n t f ( PAR\n ) ; p r i n t f ( IMPAR\n ) ; return 1 ; while ( casodeprueba ( ) ) ; // SOLUCION EN C++ #i n c l u d e <iostream > using namespace std ; 9

bool casodeprueba ( ) { i n t num ; c i n >> num ; i f (num == 1) r eturn f a l s e ; i f ( (num % 2) == 0) cout << PAR\n ; cout << IMPAR\n ; return true ; while ( casodeprueba ( ) ) ; // SOLUCION EN Java c l a s s s o l u t i o n { s t a t i c java. u t i l. Scanner in ; p u b l i c s t a t i c boolean casodeprueba ( ) { i n t n ; n = in. nextint ( ) ; i f ( n == 1) r eturn f a l s e ; i f ( ( n % 2) == 0) System. out. p r i n t l n ( PAR ) ; System. out. p r i n t l n ( IMPAR ) ; r eturn true ; 10

p u b l i c s t a t i c void main ( S t r i n g args [ ] ) { in = new java. u t i l. Scanner ( System. in ) ; while ( casodeprueba ( ) ) ; 8 Ejemplo de ejercicio con casos de prueba ilimitados Podríamos tener el mismo problema pero en el que la entrada no termina con un caso especial: Entrada La entrada consistirá en un número indeterminado de casos de prueba. Cada caso de prueba consistirá en un número entero. Salida Para cada caso de prueba el programa escribirá PAR si el caso de prueba es un número par y escribirá IMPAR si el número es impar. Las soluciones en C, C++ y Java aparecen a continuación. Como se ve, en todas ellas se sigue el mismo esquema descrito más arriba en el documento. // SOLUCION EN C #i n c l u d e <s t d i o. h> i n t casodeprueba ( ) { i n t num ; s c a n f ( %d, &num ) ; i f ( f e o f ( s t d i n ) ) r eturn 0 ; // Tambien v a l i d o : // i f ( s c a n f ( %d, &num)!= 1 ) ) // r eturn 0 ; i f ( (num % 2) == 0) p r i n t f ( PAR\n ) ; 11

p r i n t f ( IMPAR\n ) ; return 1 ; while ( casodeprueba ( ) ) ; // SOLUCION EN C++ #i n c l u d e <iostream > using namespace std ; bool casodeprueba ( ) { i n t num ; c i n >> num ; i f (! c i n ) // Fin de l a entrada r eturn f a l s e ; i f ( (num % 2) == 0) cout << PAR\n ; cout << IMPAR\n ; return true ; while ( casodeprueba ( ) ) ; 12

// SOLUCION EN Java c l a s s s o l u t i o n { s t a t i c java. u t i l. Scanner in ; p u b l i c s t a t i c boolean casodeprueba ( ) { i n t n ; i f (! in. hasnext ( ) ) r eturn f a l s e ; n = in. nextint ( ) ; i f ( ( n % 2) == 0) System. out. p r i n t l n ( PAR ) ; System. out. p r i n t l n ( IMPAR ) ; r eturn true ; p u b l i c s t a t i c void main ( S t r i n g args [ ] ) { in = new java. u t i l. Scanner ( System. in ) ; while ( casodeprueba ( ) ) ; 13