XII Concurso de Programación de la UAM Primera fase: Examen calificatorio Posgrado en Optimización UAM Azcapotzalco 26 de enero a 1 de febrero de 2015 ¡Bienvenido! El Concurso de Programación de la UAM tiene el propósito principal de fomentar el aprendizaje de la programación y los algoritmos entre los alumnos de las diversas licenciaturas de la UAM. Además, los alumnos participantes en el XII Concurso de Programación de la UAM tendrán la oportunidad de representar a nuestra institución en la etapa nacional del prestigioso evento ACM International Collegiate Programming Contest, a celebrarse en noviembre de 2015 en Guadalajara. Los equipos ganadores de la etapa nacional representarán a México en la etapa mundial que se celebrará en 2016. El XII Concurso de Programación de la UAM se realizará en tres fases: Primera fase Examen calificatorio (26 de enero a 1 de febrero de 2015). Segunda fase Examen eliminatorio (febrero o marzo de 2015). Tercera fase Examen final (marzo o abril de 2015). Una princesa de Marte Todos los problemas del XII Concurso de Programación de la UAM estarán basados libremente en la novela fantástica Una princesa de Marte escrita en 1917 por Edgar Rice Burroughs. El principio de la historia trata de cómo John Carter es transportado involuntariamente del desierto de Arizona al planeta Marte. Allí es capturado por los marcianos verdes, quienes también capturan a Dejah Toris, princesa de los marcianos rojos. El resto de la historia trata de cómo John Carter y Dejah Toris escapan de sus captores para finalmente salvar a todos los marcianos. Te invitamos a leerla. 1 Instrucciones Aquí encontrarás los enunciados de tres problemas. Cada problema tiene un valor de 100 puntos, los cuales se obtendrán de las salidas que entregue tu programa para los casos de prueba. Todos los programas se evaluarán en Linux y se ejecutarán un máximo de 1 segundo. Que tu programa funcione con el ejemplo no quiere decir que funcionará siempre. Deberás enviar por correo electrónico el código fuente de los problemas que resuelvas a la dirección [email protected] indicando claramente los siguientes datos: Datos personales Nombre completo, fecha de nacimiento y teléfono. Datos académicos Número de matrícula y créditos aprobados. Otros Licenciatura y Unidad (Azcapotzalco, Cuajimalpa o Iztapalapa). De preferencia envía todos tus códigos en un solo correo. El nombre de los archivos que envíes debe ser de la forma prg.zzz, donde prg es el nombre del programa fuente y zzz es la extensión, según el lenguaje que hayas usado. Si así lo deseas, puedes resolver cada problema en un lenguaje distinto. Tu programa deberá leer e imprimir exactamente los datos que se indican (ni más ni menos) usando la entrada y la salida estándar. En particular, tu programa no deberá borrar la pantalla, escribir ningún tipo de letrero adicional, usar la biblioteca conio, hacer pausa, etc. Quienes programen en C deberán usar gcc, quienes programen en C++ deberán usar g++ y quienes programen en Java deberán usar gcj como sigue: C gcc prg.c -o prg -lm C++ g++ prg.cpp -o prg -lm Java gcj prg.java -o prg Deberás enviar tus códigos fuente y los datos solicitados a la dirección de correo [email protected] a más tardar el 1 de febrero de 2015 a las 22:00. Te sugerimos que antes de enviar tus programas por correo te registres en omegaUp (https://omegaup.com/) y pruebes cada uno de tus programas en https://omegaup.com/arena/CalificatorioUAMXII/. Este sitio de pruebas permanecerá abierto por toda la duración del concurso. Aprovecha que te dirá si tu programa compila y funciona o no. 2 1. La edad de John Carter edad.c edad.cpp edad.java Me llamo John Carter. Ahora soy muy viejo, pero no sé mi edad. No puedo saberlo, pues no he envejecido como los humanos y no recuerdo mi infancia. Hasta donde recuerdo, siempre he parecido tener la misma edad. Supongo que no viviré para siempre, pero he muerto al menos una vez y sigo vivo. Tengo anotado cuántos días ha durado cada una de mis vidas. ¿Podrías decirme cuántos años terrestres he vivido? 1.1. Entrada Un entero V seguido de V enteros D 1 , . . . , D V que representan la cantidad de días que John Carter ha vivido en cada una de sus V vidas. Puedes suponer que 2 ≤ V ≤ 250 000 y que 1 ≤ D i ≤ 250 000 para toda 1 ≤ i ≤ V . 1.2. Salida Un entero A que sea la cantidad de años que ha vivido John Carter. Puedes suponer que cada año terrestre dura exactamente 365 días y que sólo nos interesan los años enteros. 1.3. Ejemplo Entrada 3 31415 9265 35897 Salida 209 Figura 1: En 3 vidas John Carter ha vivido 76 577 días, es decir 209 años. 3 2. El burro cargador de Powell burro.c burro.cpp burro.java Después de un año buscando oro, John Carter y su amigo James Powell finalmente encontraron una veta extraordinaria. Desafortunadamente, ésta requería maquinaria muy sofisticada para poder ser procesada, por lo que Powell decidió realizar un viaje hacia el pueblo más cercano para conseguir el equipo necesario. Para el viaje, Powell decidió llevar algunas provisiones a ser cargadas por uno de sus burros. El burro tiene un costal en su costado izquierdo y otro en el derecho y en total cargará N objetos. Para equilibrar la carga, Powell decidió llenar los costales mediante el siguiente procedimiento: Cada nuevo objeto Vi se debe cargar en el costal menos lleno; si ambos sacos tienen el mismo peso entonces el objeto debe ser colocado en el saco del lado izquierdo. Ayuda a Powell a determinar en qué saco quedó cada objeto. 2.1. Entrada Un entero N seguido de N enteros V1 , . . . , VN que representan el peso de los N objetos que serán subidos al burro en ese orden. Puedes suponer que 1 ≤ N ≤ 100 000 y que 1 ≤ Vi ≤ 100 000 para todo 1 ≤ i ≤ N. 2.2. Salida Un entero L seguido de L enteros que son los índices en orden creciente de los objetos colocados en el costado izquierdo del burro. Posteriormente, un entero R seguido de R enteros que son los índices en orden creciente de los objetos colocados en el costado derecho del burro. 2.3. Ejemplo Entrada 11 3 1 4 1 5 9 2 6 5 2 5 Salida 7 1 4 5 7 8 10 11 4 2 3 6 9 Figura 2: De los 11 objetos, 7 quedan en el costado izquierdo y 4 en el derecho. 4 3. El caballo de John Carter caballo.c caballo.cpp caballo.java John Carter, temiendo que su amigo Powell fuera capturado por los indios hostiles en su búsqueda de equipo minero, decidió seguir sus huellas a través de un sendero montañoso. Aunque el caballo de John iba a todo galope, lo irregular del terreno hacía que el caballo variara su velocidad. En terreno plano, el caballo de John era capaz de recorrer una unidad de distancia en P segundos, mientras que le tomaba S segundos recorrerla si el terreno estaba de subida y B segundos si estaba de bajada. Calcula el tiempo total en segundos que le tomó al caballo de John Carter recorrer todo el terreno. 3.1. Entrada Tres enteros P, S, B y una cadena de 1 a 1000 caracteres, donde el caracter - representa una unidad de terreno plano, / una unidad de terreno de subida y \ una unidad de terreno de bajada. Puedes suponer que 1 ≤ B ≤ P ≤ S ≤ 1000. 3.2. Salida Un entero T que sea el tiempo total en segundos que le tomó al caballo recorrer el terreno. 3.3. Ejemplo Entrada 5 7 3 -/-\- Salida 25 Figura 3: El caballo tarda 25 segundos en recorrer este terreno. 5 Apéndice: Entrada, salida y evaluación La mayoría de los programas requieren leer datos proporcionados por el usuario y emiten una salida con el resultado de dicho programa. Existen muchas maneras en las que un programa puede leer y emitir datos; la manera por defecto es mediante la entrada y la salida estándar. La entrada y salida estándar son flujos de datos que están disponibles automáticamente. Dichos flujos están usualmente vinculados a la consola. Los programas en C pueden usar la entrada y la salida estándar con las funciones de biblioteca scanf y printf respectivamente (además de algunas adicionales, como getchar y putchar). Los programas en C++ pueden usar las mismas utilidades que C y algunas adicionales: el objeto cin está vinculado por defecto a la entrada estándar y el objeto cout a la salida estándar. De manera similar, los programas en Java pueden usar los objetos System.in y System.out para la entrada y salida de datos. Para calificar los programas que envíes al concurso, se comparará lo que tu programa haya emitido en la salida estándar con lo que emita un programa correcto usando los mismos datos de entrada. La comparación será literal, es decir, la salida de tu programa y la salida del programa correcto deben ser idénticas. Es por esto que debes evitar imprimir cosas adicionales a lo especificado en cada problema: ya que nuestro programa no imprimirá cosas adicionales, tu salida será diferente si tu programa sí lo hace. La mayoría de los sistemas operativos permiten vincular la entrada y salida estándar de un programa a algo que no sea la consola de comandos. Es posible, por ejemplo, vincular dichos flujos de datos a archivos. Esto es muy útil cuando tu programa usa scanf y printf pero quieres guardar la salida de tu programa en un archivo o cuando quieres evitar tener que escribir la entrada manualmente cada vez que ejecutes tu programa. La forma de lograr esto es la misma tanto en Linux como en Windows o Mac OS si ejecutas tu programa desde la consola de comandos: Comando ./prg < ent.txt ./prg > sal.txt ./prg < ent.txt > sal.txt Descripción La entrada estándar de prg viene de ent.txt La salida estándar de prg va a sal.txt La entrada estándar de prg viene de ent.txt y la salida estándar va a sal.txt Debes recordar que al vincular la entrada estándar a un archivo, éste debe existir y debe contener los datos de la entrada, pues de lo contrario ocurrirán errores durante la lectura de datos. Cuando la salida estándar se vincula a un archivo, éste se creará o sobreescribirá cada vez que ejecutes tu programa. 6