Problema - Acuario - Olimpiada Boliviana de Informatica

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