1 Primera Olimpiada de Informática Problema - Acuario Es bien conocido que en un acuario algunos peces se pueden comer a otros. Usted tiene un acuario que contiene un cantidad de peces del cual conoce el tamaño. Usted sabe que un pez se puede comer a otro, solo cuando está en el rango de: el doble de tamaño o 10 veces más grande. Se quiere agregar un pez a la pecera, pero queremos determinar el tamaño para no causar conflictos de comerse con otros peces. Considerando esto usted debe escoger un pez que esté entre los siguientes tamaños No hay riesgo de ser comido por otro pez si su tamaño no está entre 1/10 y 1/2 inclusive, del tamaño de otro pez. No tiene tentación de comerse a otro pez si el tamaño de los otros peces no están entre 1/10 y 1/2 inclusive de su tamaño. Por ejemplo si los tamaños de los peces están entre 1 y 12 y queremos insertar un pez, ese puede tener tres posibles tamaños. Los posibles tamaños para el pez que están fuera del rango establecido son 1, 11, 12. Entrada La entrada consiste de varias lı́neas. La primera lı́nea de un caso de prueba consiste en el tamaño más pequeño. La segunda lı́nea consiste en el tamaño más grande que puede tener. La tercera lı́nea tiene el número de peces en el acuario. La cuarta lı́nea tiene los tamaños de los peces del acuario separados por un espacio. Salida Escriba en una lı́nea el número de tamaños que puede hallar y que no causen conflictos entre peces. Ejemplos de entrada Ejemplos de salida Ejemplo 1 1 12 1 1 Ejemplo 2 2 999 6 941 797 120 45 7 120 Salida del Ejemplo 1 3 Salida del Ejemplo 2 10 Primera Olimpiada de Informática 2 Problema Para el dato de entrada siguiente escriba un programa que halle la respuesta. 3 997 16 10 11 12 13 14 16 82 83 84 85 720 730 740 750 760 770 La respuesta que debes entregar es: 147 Análisis y Solución La solución del problema es bastante sencilla: Se debe tomar todos los tamaños de los peces desde el más pequeño que en nuestro programa llamaremos tamM in hasta el más grande que denominaremos tamM ax. Para cada uno de los tamaños de peces se verifica si algún pes se lo puede comer. Si no se lo puede comer contamos este tamaño como una solución. Al final imprimimos cuantas soluciones hemos encontrado. Programa que resuelve el problema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // pseudo c o d i g o // d e f i n i m o s l a s v a r i a b l e s que u t i l i z a r e m o s int n=0, tamMin=0,tamMax=0; m i e n t r a s ( c i n >>tamMin ) { l e e r (tamMax) ; l e e r (n) ; int pez [ n ] ; f or ( int i = 0 ; i <n ; i ++) l e e r ( pez [ i ] ) ; int i , j , r e s p u e s t a =0; f or i =[tamMin ; tamMax ] ; { f or j =[0 , n ) s i ( come ( i , pez [ j ] ) | | come ( pez [ j ] , i ) ) break ; s i ( j==n ) r e s p u e s t a ++; } imprimir ( respuesta ) ; } } Primera Olimpiada de Informática 3 Problema - Hash Se le dará una lista de cadenas. Cada carácter de la entrada será calculado como sigue: clave = (P osicion en el alf abeto) + (n′ umero de elemento) + (posicion en el elemento) Todas las posiciones comienzan con 0, por ejemplo la letra A tiene la posición 0, la B la 1, ası́ sucesivamente. La respuesta esperada es la suma de los caracteres en la entrada. Por ejemplo si tenemos CBA, DDD, cada elemento serı́a calculado como sigue: 2 = 2 + 0 + 0 : C en el elemento 0 posición 0 2 = 1 + 0 + 1 : B en el elemento 0 posición 1 2 = 0 + 0 + 2 : A en el elemento 0 posición 2 4 = 3 + 1 + 0 : D en el elemento 1 posición 0 5 = 3 + 1 + 1 : D en el elemento 1 posición 1 6 = 3 + 1 + 2 : D en el elemento 1 posición 2 El resultado final serı́a 2 + 2 + 2 + 4 + 5 + 6 = 21. Entrada La entrada consiste de varios casos de prueba. Cada caso de prueba viene en una linea que contiene todos los elementos separados por un espacio. La entrada termina cuando no hay más datos. Salida Por cada caso de prueba escriba en una lı́nea la clave encontrada con el procedimiento anterior. Ejemplos de entrada CBA DDD Z A B C D E F ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ZZZZZZZZZZ Ejemplos de salida 21 25 30 1326 295 Primera Olimpiada de Informática 4 Problema Para el dato de entrada siguiente escriba un programa que halle la respuesta. ES WU DD WC PP OM OU VW DT JL YN VM WI YI OA YE ZV HA RG BO WA YM NJ GJ WA RU La respuesta que debes entregar es: 1364 Análisis y Solución El problema consiste en recorrer una secuencia de palabras que vienen en una fila. Por ejemplo si las palabras son CBA DDD entonces los elementos son las palabra CBA es cero y el elemento 1 es DDD. Las posiciones de las letras según el orden del alfabeto es como sigue: A = 1, B = 2, C = 3, D = 4.... La posición en cada elemento comienza con 0, en el elemento 0, las posiciones son: C = 0, B = 1, A = 2. Con estas consideraciones resolvemos el problema. Programa que resuelve el problema 1 2 3 4 5 6 7 8 // p s u d o c o d i g o l e e r una l i n e a completa i n i c i a r e l r e s u l t a d o en 0 f or el em en t o = ( desde e l primero , a l u l t i m o ) { S acar un el em en t o de l a f i l a f or pos =(0 , h a s t a e l tamano de el em en t o ) { r e s u l t a d o = r e s u l t a d o + c a r a c t e r en l a p o s i c i o n por + el em en t o + posicion ; 9 } 10 } 11 i m p r i m i r ( r e s u l t a d o ) ; Primera Olimpiada de Informática 5 Problema - Monitoreo de Azimuth Un robot se està moviendo en el plano siguiendo un conjunto de instrucciones. Las instrucciones permitidas son: LEF T RIGHT T U RN AROU N D LEF T X RIGHT X HALT doblar 90 grados a la izquierda doblar 90 grados a la derecha doblar 180 grados doblar X grados a la izquierda, donde X es un número entero. doblar X grados a la izquierda, donde X es un número entero. parar, no se ejecutan más instrucciones. Se pide hallar los grados en sentido al recorrido del reloj, en los que estarı́a apuntando el robot. Por ejemplo si las instrucciones son: RIGHT 59 RIGHT RIGHT HALT LEFT LEFT LEFT Para hallar la posición del robot procedemos como sigue a la derecha 59 grados, derecha otra vez dando 149 grados, derecha otra vez 239. Después detener, por lo que el resultado es 239. Veamos otro ejemplo: LEFT En este ejemplo recorremos 90 grados a la izquierda por lo que tendremos 360 − 90 = 270 Entrada La entrada consiste de varia lı́neas. La primera lı́nea contiene el numero N de instrucciones. Las siguientes N lı́neas tienen las instrucciones del robot una instrucción en cada lı́nea. Salida Escriba los grados en sentido al recorrido del reloj, en los que estarı́a apuntando el robot. 6 Primera Olimpiada de Informática Ejemplos de entrada Ejemplos de salida Ejemplo de entrada 1 RIGHT Ejemplo de entrada 3 LEFT LEFT TURN AROUND Ejemplo de entrada 8 LEFT 5 RIGHT 10 LEFT 15 RIGHT 20 LEFT 25 RIGHT 30 LEFT 35 RIGHT 40 Ejemplo de entrada 7 RIGHT 59 RIGHT RIGHT HALT LEFT LEFT LEFT Salida 90 Salida 0 Salida 20 Salida 239 1 2 del ejemplo 1 del ejemplo 2 del ejemplo 3 del ejemplo 4 3 4 Problema Para el dato de entrada siguiente escriba un programa que halle la respuesta. 22 LEFT 43 LEFT 10 TURN AROUND LEFT 155 LEFT 87 RIGHT 62 RIGHT 94 LEFT RIGHT 13 RIGHT LEFT 69 LEFT 90 LEFT 177 Primera Olimpiada de Informática RIGHT 157 LEFT 74 LEFT 106 LEFT 133 LEFT 142 HALT LEFT 156 RIGHT 62 RIGHT 84 La respuesta que debes entregar es: 140 Análisis y Solución La solución se halla haciendo un seguimiento de las instrucciones del robot. En cada iteración hay que separar la instrucción de los grados y luego hacer la suma. Programa que resuelve el problema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 // psudoo c o d i g o que r e s u e l v e e l problema . Leer l a c a n t i d a d de i n s t r u c c i o n e s y gu ar d ar en n . Comenzamos con r e s =0 Leer una l i n e a de t e x t o y almacenar en s Ahora p r o c e s a r l a i n s t r u c c i o n i f ( s==”RIGHT” ) r e s += 9 0 ; e l s e i f ( s==”TURN AROUND” ) r e s +=180; e l s e i f ( s==”HALT” ) break ; e l s e i f ( s== ”LEFT” ) r e s −= 9 0 ; else { S e p a r a r en t e x t o y numero . i f ( i n s t == ”RIGHT” ) r e s += numero ; else r e s −= numero ; } } r e s +=3600000; c o u t << ( r e s \ % 3 6 0 ) << e n d l ; } 7 8 Primera Olimpiada de Informática Problema - Juego Balanceado Se trata de un juego en el cual cada elemento representa un jugador en un juego de múltiples jugadores. El elemento i representa el jugador i y el carácter j de cada elemento i representa si el jugador i va a ganar W , empatar t, o perder L contra el jugador J. Su tarea es asegurar que cada jugador gane al menos al p % con los otros jugadores, y pierda al menos un q % con los otros jugadores. Comenzando en ı́ndice cero que corresponde al primer jugador, debe imprimir el ı́ndice del primer jugador que no cumple esta condición. Si todos los jugadores cumplen este requerimiento debe imprimir −1. Vea que si hay N jugadores al menos, el número de caracteres techo((N − 1) ∗ p/100) del elemento i debe ser W . La fórmula para las pérdidas es análoga. Entrada La entrada consiste de varias lı́neas. La primera lı́nea contiene el número N de elementos. Luego siguen N elementos seguidos por un espacio. Después vienen los valores P y Q. Salida Escriba en una linea el ı́ndice menor para el cual no se cumple el requerimiento solicitado o −1 si ningún elemento cumple el requerimiento. Ejemplos de entrada Ejemplos de salida Ejemplo de entrada 1 4 TWWW LTWW LLTW LLLT 20 20 Ejemplo de entrada 2 4 TWWW LTWW LLTW LLLT 0 0 Ejemplo de entrada 3 3 TTT TTT TTT 1 1 Salida para el ejemplo 1 0 Salida para el ejemplo 2 -1 Salida para el ejemplo 3 0 Problema Para el dato de entrada siguiente escriba un programa que halle la respuesta. 18 TLLLLLTWWWWTLLWWWT WTTWTTLLWLLWWLTLWW Primera Olimpiada de Informática WTTWWTLWTWLWWWWLTW WTLWTLWWWWLLWLLWTW TWWLLLTLLWTWWWLLWW LLTLLWWLTTWLTWTLWT LWWLWTTWLTTTLLWWLL WLLLLWLLTWWWTWLLWW LTLWWLWWTWLTWTTTWT LLTWTWLLLTWWLWLWTW 18 6 9 WLLTLTWWWTWLWLLWLT WTTTWTWLLWTLLWWWLW LWLLLWWTWLLWWLLLWT LWLTLLLWTTTLLLLWTW TLLWWWLLWWTTLWTTLL WWLWWLLWLWWLLTTWLL LWWLLLWWWLLTWLTTLW TLLTLLLTTLWWLWTLLT La respuesta que debes entregar es: 17 Análisis y Solución Para resolver este problema hay que leer todos las cadenas con los datos de que gano y perdió. Luego leemos p, q y calculamos los porcentajes Calcular gana = (int) ceil( (N-1) * p / 100.0) Calcular pierde = (int) ceil( (N-1) * q / 100.0); Luego hallamos el numero de veces que ganó o perdió cada jugador. Esto se hace recorriendo la cadena carácter por carácter. Finalmente si algún carácter esta entre gana y pierde, imprimimos el ı́ndice que representa el numero de jugador imprimimos el resultado y finalizamos. Programa que resuelve el problema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // Psudo c o d i g o qur r e s u e l v e e l programa Leer $n$ e l numero de j u g a d o r e s . Leer l a s $n$ cadenas i y gu ar d ar en un v e c t o r denominado c o n f l i c t o s . Leer p y q f or i =(0 ,n ) { C a l c u l a r gana = ( int ) c e i l ( (N−1) ∗ p / 1 0 0 . 0 ) C a l c u l a r p i e r d e = ( int ) c e i l ( (N−1) ∗ q / 1 0 0 . 0 ) ; numGana = 0 , numPierde = 0 ; // c o n t a r e l numero de W y L . f or j =(0 , j < c o n f l i c t o s [ i ] . s i z e ( ) ) char c = c o n f l i c t o s [ i ] . a t ( j ) ; i f ( c == ’W’ ) numGana++; e l s e i f ( c == ’L ’ ) numPierde++; i f (numGana >= gana && numPierde >= p i e r d e ) continue ; else { r e s u l t = i ; break ; } Primera Olimpiada de Informática 19 } 20 imprimir r e s u l t ; 21 } 22 } 10 11 Primera Olimpiada de Informática Problema - Canastas de frutas Tenemos varias canastas de frutas que contienen manzanas. Deseamos realizar el siguiente procedimiento. Primero descartamos 0 ó más canastas completamente. Si las canastas restantes no contienen el mismo número de manzanas quitamos algunas manzanas hasta que si tengan. Lo que tratamos de hacer es maximizar la cantidad de manzanas que quedan. Por ejemplo si tenemos tres cajas de manzanas con las siguientes cantidades 1, 2, 3. Si hacemos que todas las cajas tengan 1 manzana al final tendremos 3 manzanas. Si descartamos la primera caja y luego igualamos las cajas a 2 tendrı́amos el máximo que es 4 manzanas. Entrada La entrada consiste de lineas de un caso de prueba contiene el numero de cajas de manzanas. Luego viene la cantidad de manzanas que tienen cada caja. Salida Escriba en una lı́nea el valor máximo de manzanas que quedarı́an después del procedimiento anterior. Ejemplos de entrada Ejemplos de salida Ejemplo 1 3 1 2 3 Ejemplo 2 4 5 0 30 14 Ejemplo 3 4 51 8 38 49 Salida para el ejemplo 1 4 Salida para el ejemplo 2 30 Salida para el ejemplo 3 114 Problema Para el dato de entrada siguiente escriba un programa que halle la respuesta. 6 18 54 63 54 61 60 La respuesta que debes entregar es: 270 Primera Olimpiada de Informática 12 Análisis y Solución Para resolver el problema tomamos una cajón de manzana y luego buscamos todos los que tienen una cantidad mayor o igual. En el ejemplo tenı́amos un los valores 1, 2, 3. Comenzamos con el 1, y vemos que hay 3 valores mayores o iguales a 1. Luego decimos que una posibilidad es llevar 3 cajones cada uno con una manzana. Luego hacemos lo mismo con el segundo valor y obtenemos dos valores, por lo que solo se podrán transportar 2 canastas con dos manzanas cada una. Como 4 es un valor mejor tomamos este como una posible respuesta. Luego tomamos el 3 y vemos que solo un valor es mayor o igual, que es el mismo 3. Esto nos da un máximo de tres. Guardando el valor máximo en cada iteración obtenemos la respuesta que es 4. Esto se resuelve como se muestra con dos ciclos anidados. Programa que resuelve el problema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // psudo c o d i g o que r e s u l v e e l problema Leemos l a c a n t i d a d $n$ de manzanas // lemmos l a c a n t i d a d de manzanas por c a n a s t a f or i =(0 ,n ) l e e r manzanas [ i ] ; d e f i n i m o s una v a r i a b l e para almacenar e l máximo mejorAqui = 0 ; // recorremos l o s e l v e c t o r tomando una c a n a s t a // y h a l l a m o s c u a n t o s c a j o e s son mayores o i g u a l e s // e s t o nos d i c e c u a n t a s manzanas podemos t r a n s p o r t a r // de e s t a forma h a l l a m o s e l r e s u l t a d o f or i ( 0 , n ) tempCantidad = 0 ; f or ( int j = 0 ; j <n ; j ++) i f ( manzanas [ j ] >= manzanas [ i ] ) tempCantidad=tempCantidad+ manzanas [ i ] ; 16 mejorAqui = max( tempCantidad , mejorAqui ) ; 17 18 i m p r i m i r l a r e s p u e s t a mejorAqui 13 Primera Olimpiada de Informática Problema - Bits Las computadoras operan en números binarios. Casi todos los cálculos se realizan manipulando 0’s y 1’s. Para que las computadoras puedan utilizar los números que le damos hay que convertirlos de la base 10 que normalmente usamos, a la base binaria (2). En muchas ocasiones es útil determinar cuantos bits se requieren para representar un número, con la finalidad de ahorrar espacio. Por ejemplo cualquier numero menor a 256 se puede representar con 8 bits. Para hallar el equivalente decimal de un número binario procedemos como sigue: Para cada número 1 sumamos las potencias 2i donde i el el número de dı́gitos a la derecha del uno. Por ejemplo el equivalente decimal del número binario 10100 se halla como sigue: a la derecha del primer 1 hay 4 dı́gitos dando 24 = 16, a la derecha del segundo 1 hay dos dı́gitos que representa 22 = 4. Sumando ambos tenemos su equivalente decimal que es 20. Entrada La entrada contiene el número que queremos representar en binario. Salida Escriba en una lı́nea el numero mı́nimo de bits que se requiere para representar este n?umero. Ejemplos de entrada Ejemplos de salida 32 12 1 6 4 1 Problema Para el dato de entrada siguiente escriba un programa que halle la respuesta. 1500 La respuesta que debes entregar es: 11 Análisis y Solución Para hallar el numero de bits necesarios para representar un numero en binario hallamos el logaritmo en base 2. Veamos algunos ejemplos. El numero 8 se escribe en binario 1000 osea todos números menores a 8 se pueden representar con 3 bits. 8 − 1 = 7 en binario 111. Con 4 bits podemos representar hasta el numero 15. Primera Olimpiada de Informática 14 Vemos que entonces 23 = 8 y con 3 + 1 bits podemos representar hasta el 15. Resolviendo con logaritmos hallamos la respuesta. Como la función logaritmos no es en base 2 es necesario hacer el cambio de base. Programa que resuelve el problema 1 Leer e l v a l o r de n 2 c a l c u l a r r e s p=l o g ( n ) / l o g ( 2 ) + 1 ) ) ; 15 Primera Olimpiada de Informática Problema - Tienda de Botas Una tienda de botas ha recibido un embarque de una fábrica. Consiste en N botas izquierdas y N botas para el pie derecho. Una bota izquierda con otra derecha harán un par si son del mismo tamaño. Cada bota solo puede pertenecer a un solo par. Los empleados de la tienda de botas quiere crear N pares de botas. Afortunadamente la fábrica ha prometido cambiar cualquier numero de botas en el embarque por nuevas en diferentes tamaños. Se tiene todas las botas izquierdas y derechas con sus números. Escriba un programa que devuelva el mı́nimo número de botas que deben ser intercambiadas. Input Los datos de entrada consiste de varias lı́neas, la primera lı́nea contiene el número N de botas izquierdas. Las botas derechas son la misma cantidad. La segunda lı́nea contiene N números que representan los tamaños de las botas izquierdas. La tercera lı́nea contiene N números con los tamaños de las botas derechas. Output Escriba en una lı́nea con el mı́nimo numero de botas a ser intercambiadas. Ejemplos de entrada Ejemplos de salida Ejemplo 3 1 3 1 2 1 3 Ejemplo 2 1 3 2 2 Ejemplo 7 1 2 3 4 2 4 6 1 Salida para el ejemplo 1 1 Salida para el ejemplo 2 2 Salida para el ejemplo 3 0 de entrada 1 de entrada 2 de entrada 3 5 6 7 3 7 5 Problema Para el dato de entrada siguiente escriba un programa que halle la respuesta. 10 5 2 1 4 7 9 1 1 3 4 2 5 1 3 4 6 3 2 2 5 La respuesta que debes entregar es: Primera Olimpiada de Informática 16 5 Análisis y Solución Este programa consiste en saber cuantos pares de botas debemos intercambiar. Para esto primero ordenamos las botas por talla y vemos cuales igualan. De los que no igualan debemos hacer el cambio. La forma adecuada se muestra en psudocodigo. Programa que resuelve el problema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Leer c u a n t a s b o t a s son Leer t a l l a s de l a s b o t a s i z q u i e r d a s Leer t a l l a s de l a s b o t a s d e r e c h a s Ordenar l a s i z q u i e r d a s Ordenar l a s Derechas // contamos cuandas d i f e r e n t e s hay c = 0; f or x=( 0 ; numero b o t a s i z q u i e r d a s ) { f or y =(0; numero de b o t a s d e r e c h a s ) { i f ( i z q u i e r d a [ x ] == d e r e c h a [ y ] ) { i z q u i e r d a [ x ] = d e r e c h a [ y ] = −1; c++; } } } Imprimir l a s b o t a s i z q u i e r d a s menos l a c a n t i d a d c a l c u l a d a 17 Primera Olimpiada de Informática Problema - Serie curiosa Se tiene una serie que tiene como datos de la misma d números los mismos que son enteros positivos. Por ejemplo si se tiene los siguientes 4 números datos de la serie: 1, 2, 3, 4; los restantes se generan ası́: 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6........ El problema es que se quiere encontrar el n-simo, en el ejemplo planteado el 7mo elemento será 4. Entrada Se da como entrada dos números enteros positivos n, d, el primero corresponde al n-simo elemento que se quiere encontrar y el segundo es la cantidad de números dato que la serie tendrá. d puede estar entre 3 y 10 inclusive; y n puede estar entre 1 y 100000 inclusive. En la siguiente lı́nea se encuentran d números enteros que son los datos iniciales de la serie. Salida La salida es un entero positivo que corresponde al n-simo número de la serie. Ejemplos de entrada Ejemplos de salida 10 5 1 3 5 7 9 10 Problema Para el dato de entrada siguiente escriba un programa que halle la respuesta. 10000 5 1 3 2 7 5 La respuesta que debes entregar es: Análisis y Solución Programa que resuelve el problema 1 Leemos l o s p r i m e r o s e l e m e n t o s de l a s e r i e 2 datoBase = n %d ; 3 i n c r = n/d ; 4 Primera Olimpiada de Informática 5 i f ( datoBase == 0 ) { 6 datoBase = d ; 7 incr = incr − 1; 8 } 9 v a l o r = d a t o s [ datoBase ] + i n c r ; 10 mostrar v a l o r 18