XII Concurso de Programación de la UAM Primera fase: Examen

Anuncio
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
Descargar