1 Primera Olimpiada de Informática Problema - Sumando Digitos Comenzando con un entero entre 00 y 99 inclusive, escritos como dos dı́gitos (use un cero a la izquierda en caso de que el numero sea menor que 10). Realice los siguiente: 1. Sume los dos dı́gitos. 2. Ahora concéntrese en el dı́gito de la derecha, en el número original y en el de la suma. 3. Finalmente combine estos números. Si repetimos este proceso varias veces obtenemos el número original.. Por ejemplo Inicio Sume los dos dı́gitos Combine los dos dı́gitos -----------------------------------------------------26 : 2+6 = 08 : "6" y "8" = 68 68 : 6+8 = 14 : "8" y "4" = 84 84 : 8+4 = 12 : "4" y "2" = 42 42 : 4+2 = 06 : "2" y "6" = 26 En este caso tomo 4 pasos para obtener el número original. Se pide que devuelva el número de pasos requeridos para obtener el número original. Entrada Escriba en una linea que contiene un numero 0 ≤ N ≤ 99. Salida Escriba en una lı́nea el numero de pasos requeridos para obtener el numero original. Ejemplos de entrada Ejemplos de salida 26 55 0 4 3 1 Problema Para el dato de entrada siguiente escriba un programa que halle la respuesta. 71 La respuesta que debes entregar es: 12 Primera Olimpiada de Informática 2 Análisis y Solución Para obtener el primer dı́gito de un numero de dos dı́gitos hacemos dividimos por 10, el ultimo dı́gito se halla haciendo modulo 10. Luego nos piden sumar ambos. Para crear un numero nuevo con el primer dı́gito y el ultimo dı́gito hallado multiplicamos el primer dı́gito por 10 y sumamos el segundo. 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 #include <i o s t r e a m > #include <v e c t o r > u s i n g namespace s t d ; int main ( ) { int count = 1 ; int s t a r t ; c i n >>s t a r t ; int n=s t a r t ; f or ( ; ; count++) { int m = n/10 + n %10; n = ( n %10)∗10 + m%10; i f ( n == s t a r t ) { cout<< count << e n d l ; break ; } } } 3 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 4 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 21 #include <i o s t r e a m > #include <v e c t o r > u s i n g namespace s t d ; b o o l come ( int v1 , int v2 ) { return ( v1>=v2 ∗2 && v1<=v2 ∗10) ; } int main ( ) { int n=0, tamMin=0,tamMax=0; c i n >>tamMax ; c i n >>n ; int pez [ n ] ; f or ( int i = 0 ; i <n ; i ++) c i n >>pez [ i ] ; int i , j , r e s p u e s t a =0; f or ( i=tamMin ; i<=tamMax ; i ++) { Primera Olimpiada de Informática 22 23 24 25 26 27 28 29 30 } f or ( j =0; j <n ; j ++) i f ( come ( i , pez [ j ] ) | | come ( pez [ j ] , i ) ) break ; i f ( j==n ) r e s p u e s t a ++; } cout<< r e s p u e s t a << e n d l ; 5 6 Primera Olimpiada de Informática Problema - Gusanillo El gusanillo es una criatura de hábitos regulares. Se estira hacia adelante alguna distancia a lo largo de una rama de un árbol y para descansar. Si se detiene en una hoja se la come. Luego se estira la misma distancia que se estiro antes, y repite esta rutina hasta que se pasa del final de la rama. Considere un gusanillo que recorre la longitud de una rama cuyas hojas esta espaciadas a intervalos uniformes. Dependiendo de la distancia entre el gusanillo y sus puntos de descanso puede o no puede comerse todas las hojas. Siempre existe una hoja al principio de la rama donde descansa antes de iniciar su recorrido. Dados tres valores que especifican la longitud de la rama en centı́metros, la distancia que recorre entres descansos y la distancia entre un par consecutivo de hojas, calcule el numero de hojas que el gusanillo consumirá. Entrada En una lı́nea, separados por un espacio, vienen el tamaño de la rama, la distancia que recorre entre descansos y la distancia entre pares consecutivos de hojas. La entrada termina cuando no hay mas datos. Salida Escriba en una lı́nea el número de hojas que el gusanillo comerı́a. Ejemplos de entrada Ejemplos de salida 11 12 20 21 15 3 2 1 2 1 2 4 6 4 3 7 7 3 16 5 Problema Para el dato de entrada siguiente escriba un programa que halle la respuesta. 175599 736 7 La respuesta que debes entregar es: 35 Análisis y Solución Debemos sumar el avance del gusanillo hasta llegar al final de la rama, en cada avance hay que ver si se encuentran hojas. Primera Olimpiada de Informática 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 25 #include <i o s t r e a m > #include <v e c t o r > u s i n g namespace s t d ; int c o n t a r ( int rama , int d escan so , int h o j a s ) { int c t = 0 ; int i = 0 ; f or ( ; ; ) { i f ( i > rama ) { return c t ; } i f ( i % h o j a s == 0 ) c t++ ; i += d e s c a n s o ; } } int main ( ) { int rama , d escan so , h o j a s ; c i n >> rama ; c i n >> d e s c a n s o ; c i n >> h o j a s ; c o u t << ( c o n t a r ( rama , d escan so , h o j a s ) ) << e n d l ; } 7 8 Primera Olimpiada de Informática Problema - Mastil El mástil de un velero se ha roto, y debemos reemplazarlo, para ello se necesita saber la medida exacta del mismo. En el velero ha quedado la cuerda aún amarrada de los extremos al piso del bote. Cada amarre se encuentra a una distancia distinta de la base del mastil, estas distancias son conocidas además del largo de la cuerda en la que se sujetan las velas, un ejemplo de la situación se muestra en la figura. Con esta información se debe calcular el alto del mastil. Entrada La entrada consiste de tres numeros enteros positivos: m, n, largo, que indican la distancia del primer amarre, del segundo amarre y el largo de la cuerda, respectivamente. m , n, puede tomar valores entre 2 y 100 inclusive, y el largo de la cuerda entre 5 y 1000 inclusive. El largo siempre es mayor que la suma de m y n. Salida La salida es un número real con a lo sumo dos dı́gitos de precisión que indique la altura del mástil a comprar. Ejemplos de entrada Ejemplos de salida 3 5 10 2.9 Problema Para el dato de entrada siguiente, escriba un programa que halle la respuesta. 5 6 20 9 Primera Olimpiada de Informática Problema - Apariencia triangular Se puede contornear un triángulo rectángulo en base a puros asteriscos. Para ello se requiere de la altura y base del triángulo. Hay que tener cuidado que sólo funciona para triángulos rectángulos perfectos, es decir que se pueda mostrar con esos datos de forma correcta. En caso de que el triángulo no cumpla esta condición de perfección, entonces debe mostrar un mensaje “No posible”. Encuentra la condición para que un triángulo sea perfecto y realiza el proceso que permita decidir si es posible o no al triángulo mostrarse. Por ejemplo: Si el triángulo tiene altura 4 y base 3, es posible mostrar, y el contorno será: * * * * * * * * por lo que la respuesta será: “Si posible”. Pero si el triágulo tiene altura 5 y base 3 no se puede mostrar, por lo que la respuesta es “No posible”. Entrada Se da como entrada la altura y base del triángulo, que son números enteros positivos entre 3 y 1000 inclusive. La base siempre es menor que la altura. Salida La salida es un mensaje “Si posible” o “No posible”. Ejemplos de entrada Ejemplos de salida 10 5 No posible Problema Para el dato de entrada siguiente escriba un programa que halle la respuesta. 1000 500 La respuesta que debes entregar es: No posible Primera Olimpiada de Informática 10 Análisis y Solución Luego de hacer varios dibujos podemos llegar a la conclusión que (2 ∗ base − 4) = altura − 2. En este caso no es aplicable el teorema de Pitágoras, porque, debe considerar que un carácter no puede estar en media linea. Programa que resuelve el problema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include<i o s t r e a m > u s i n g namespace s t d ; int main ( ) { int a l t u r a , b ase ; c i n >>a l t u r a ; c i n >>b ase ; // ( base −1)∗2 −2 i f ( ( 2 ∗ base −4) == a l t u r a − 2 ) cout<<” S i p o s i b l e ”<<e n d l ; else cout<<”No p o s i b l e ”<<e n d l ; return 0 ; }