Solucionario Nivel 3 - Preguntas tipo 2

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