Download Solucionario del Nivel 2 (2011) - usando PSEINT

Document related concepts
no text concepts found
Transcript
ACM – ICPC Bolivia
Solucionario Consolidado
Utilizando PSeInt
1ra Olimpiada Boliviana de Informática
Estado Plurinacional de Bolivia, febrero de 2013
Contenidos
Final Nacional 2011 ............................................................................................................ 1
Problema A: Múltiplo Pequeño ...................................................................................... 1
Problema B: El resto ....................................................................................................... 3
Problema C: Cuando Ver Películas................................................................................. 4
Problema D: La granja de Juan y José ............................................................................ 6
Clasificatorio 2011 .............................................................................................................. 7
Problema A - Acuario ..................................................................................................... 7
Problema B - Bits .......................................................................................................... 10
Problema C - Tienda de Botas ...................................................................................... 12
Problema D - Serie curiosa ........................................................................................... 14
Alberto J. Suxo Riveros
<[email protected]>
Alberto J. Suxo Riveros
1
ACM – ICPC Bolivia
Final Nacional 2011
Problema A: Múltiplo Pequeño
Muchos números naturales de base 10 consisten en múltiples números 1 y 0. Por
ejemplo el número once 11, el diez 10 el ciento uno 101.
Dado un numero X se desea conocer cuál es el múltiplo más pequeño de X que puede
formarse exclusivamente de unos y ceros.
Si X = 55 el múltiplo más pequeño que podemos formar con unos y ceros es 110.
Entrada
En la entrada defina X = 7.
Salida
Escriba en una línea el número formado por unos y ceros más pequeño que es múltiplo
de X.
Ejemplos
X
2
5
10
25
Respuesta
10
10
10
100
Solución
//
//
//
//
//
//
Olimpiada Boliviana De Informatica
Problema : Multiplos Pequeños
Autor
: Alberto Suxo
Copyright: Team SIM
Lenguaje : Pseudocodigo PSeInt
*******************************
// Verifica si un numero esta compuesto
// unicamente por unos y ceros
SubProceso resultado <- verificar ( numero )
Definir num Como Entero;
Definir resultado Como Logico;
resultado <- Verdadero;
num <- numero;
Mientras num > 0 Hacer
Si num%10 > 1 Entonces
resultado <- Falso;
FinSi
num <- num / 10;
FinMientras
FinSubProceso
Proceso MultiploPequeno
Definir x, m Como Entero;
Definir buscar Como Logico;
Alberto J. Suxo Riveros
1
ACM – ICPC Bolivia
Leer x;
buscar <- Verdadero;
m <- 0;
Mientras buscar Hacer
m <- m + 1;
Si verificar( x*m ) Entonces
Escribir (x*m);
buscar <- Falso;
FinSi
FinMientras
FinProceso
Alberto J. Suxo Riveros
2
ACM – ICPC Bolivia
Problema B: El resto
Los números de Fibonacci se generan con la ecuación:
f n = f n−1 + f n−2
La lista de números generados por esta secuencia son 1, 1, 2, 3, 5, 8, 13, 21,... etc. Los
primeros números de esta secuencia se definen como sigue:
i
Fib(i)
0
1
1
1
2
2
3
3
4
5
5
8
6
13
7
21
Dado un número X se desea conocer el resto de dividir un determinado número
Fibonacci por X.
Por ejemplo si X = 7, y i = 6 en resto seria 13 %7 = 6.
Entrada
Defina en su programa i = 19 y X = 29.
Salida
Escriba en una línea el resto de dividir el Fibonacci i por X.
Ejemplos
i
3
6
3
x
7
9
11
Respuesta
3
4
3
Solución
// Olimpiada Boliviana De Informatica
// Problema : El Resto
// Autor
: Alberto Suxo
// Copyright: Team SIM
// Lenguaje : Pseudocodigo PSeInt
// *******************************
Proceso Resto
Definir x, i Como Entero;
Definir Fib, n Como Entero;
Dimension Fib[100];
Leer i;
Leer x;
Fib[0] <- 1;
Fib[1] <- 1;
Para n<-2 Hasta i Hacer
Fib[n] <- Fib[n-1] + Fib[n-2];
FinPara
Escribir ( Fib[i] % x );
FinProceso
Alberto J. Suxo Riveros
3
ACM – ICPC Bolivia
Problema C: Cuando Ver Películas
En la ciudad de La Paz existen diferentes lugares para ver películas pero ninguno como
el Cine IOI. El precio de las entradas en este cine varía dependiendo el día, 10
Bolivianos los días Miércoles 30 Bolivianos los Sábados y Domingos y 20 Bolivianos los
demás días.
Considerando que hoy es Lunes y solo podemos ver una película al día, ayúdanos a
elegir los días en los que tenemos que ver N películas de tal forma que nos salga lo
más económico posible.
Entrada
Defina en su programa los días para ver películas en 92 y el número de películas a ver
en 62.
Entrada
Por cada caso de prueba imprima una línea con el mínimo costo para ver películas.
Ejemplos
Días para ver Películas
2
3
7
Número Películas
1
1
7
Resultado
20
10
150
Solución
//
//
//
//
//
//
Olimpiada Boliviana De Informatica
Problema : Cuando Ver Peliculas
Autor
: Alberto Suxo
Copyright: Team SIM
Lenguaje : Pseudocodigo PSeInt
*******************************
Proceso CuandoverPeliculas
Definir dias, peliculas Como Entero;
Definir P, D Como Entero;
Definir resp, i, j, aux Como Entero;
Dimension P[7];
Dimension D[100];
Leer dias;
Leer peliculas;
P[0] <- 20;
P[1] <- 20;
P[2] <- 10;
P[3] <- 20;
P[4] <- 20;
P[5] <- 30;
P[6] <- 30;
Para i<-0 Hasta dias-1 Hacer
D[i] <- P[i%7];
FinPara
// Ordenar
Para i<-0 Hasta dias-2 Hacer
Alberto J. Suxo Riveros
4
ACM – ICPC Bolivia
Para j<-i+1 Hasta dias-1 Hacer
Si D[i] > D[j] Entonces
aux <- D[i];
D[i] <- D[j];
D[j] <- aux;
FinSi
FinPara
FinPara
resp <- 0;
Para i<-0 Hasta peliculas-1 Hacer
resp <- resp + D[i];
FinPara
Escribir resp;
FinProceso
Alberto J. Suxo Riveros
5
ACM – ICPC Bolivia
Problema D: La granja de Juan y José
Juan y José tienen una granja de gallinas y vacas, un día se les ocurrió contar el
número de cabezas y el número de patas de los animales (vacas y gallinas) en la
granja. Juan contó un total de 3 cabezas y José contó un total de 8 patas del total de
animales en la granja. Juan hizo algunos cálculos y determino que existen 3 gallinas y 1
vaca. José noto que Juan tarda demasiado en hacer los cálculos, así que pide tu ayuda
para poder obtener una solución general del problema.
Nota.- Una gallina tiene 1 cabeza y 2 patas. Una vaca tiene 1 cabeza y 4 patas. Si la
solución existe, esta siempre es única.
Entrada
En su programa defina el número de cabezas = 8200 y del patas = 18844.
Salida
Escriba en la salida separado por un espacio el número de gallinas y el segundo es el
número de vacas. En caso de no existir solución imprimir -1;
Ejemplos
Cabezas
3
10
1
Patas
8
40
3
Resultado
2 1
0 10
-1
Solución
//
//
//
//
//
//
Olimpiada Boliviana De Informatica
Problema : La Granja de Juan y Jose
Autor
: Alberto Suxo
Copyright: Team SIM
Lenguaje : Pseudocodigo PSeInt
*******************************
Proceso Granja
Definir cabezas, patas Como Entero;
Definir gallinas, vacas Como Entero;
Leer cabezas;
Leer patas;
Si patas%2 = 1 Entonces
Escribir -1; //"No hay Solucion";
Sino
vacas <- patas/2 - cabezas;
gallinas <- cabezas - vacas;
Si vacas<0 | gallinas < 0 Entonces
Escribir -1; //"No hay Solucion";
Sino
Escribir gallinas, " ", vacas;
FinSi
FinSi
FinProceso
Alberto J. Suxo Riveros
6
ACM – ICPC Bolivia
Clasificatorio 2011
Problema A - Acuario
Es bien conocido que en un acuario algunos peces se pueden comer a otros. Usted
tiene un acuario que contiene una 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
Alberto J. Suxo Riveros
7
ACM – ICPC Bolivia
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 tamMin hasta el más grande que denominaremos tamMax.
Para cada uno de los tamaños de peces se verifica si algún pez 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.
Solución
//
//
//
//
//
//
Olimpiada Boliviana De Informatica
Problema : Acuario
Autor
: Alberto Suxo
Copyright: Team SIM
Lenguaje : Pseudocodigo PSeInt
*******************************
SubProceso resp <- come( a, b )
Definir resp como Logico;
Definir min, max Como Real;
min <- a/10.0;
max <- a/2.0;
Si min<=b && b<=max Entonces
resp <- Verdadero;
Sino
resp <- Falso;
FinSi
FinSubProceso
Proceso Acuario
Definir n, tamMin, tamMax Como Entero;
Definir i, j, respuesta como Entero;
Definir valido como Logico;
Definir Pez Como Entero;
Dimension Pez[200];
Leer tamMin;
Leer tamMax;
Leer n;
Alberto J. Suxo Riveros
8
ACM – ICPC Bolivia
Para i<-0 Hasta n-1 Hacer
Leer Pez[i];
FinPara
respuesta <- 0;
Para i<-tamMin Hasta tamMax Hacer
valido <- Verdadero;
Para j<-0 Hasta n-1 Hacer
Si come(i,Pez[j]) || come(Pez[j],i) Entonces
valido <- Falso;
FinSi
FinPara
Si valido Entonces
respuesta <- respuesta + 1;
FinSi
FinPara
Escribir respuesta;
FinProceso
Alberto J. Suxo Riveros
9
ACM – ICPC Bolivia
Problema B - 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 número 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 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 número mínimo de bits que se requiere para representar este
número.
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 número de bits necesarios para representar un número en binario
hallamos el logaritmo en base 2.
Veamos algunos ejemplos. El número 8 se escribe en binario 1000 o sea 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 número 15.
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.
Alberto J. Suxo Riveros
10
ACM – ICPC Bolivia
Solución
//
//
//
//
//
//
Olimpiada Boliviana De Informatica
Problema : Bits
Autor
: Alberto Suxo
Copyright: Team SIM
Lenguaje : Pseudocodigo PSeInt
*******************************
Proceso Bits
Definir n, respuesta como Entero;
Leer n;
respuesta <- LN(n)/LN(2) + 1;
Escribir respuesta;
FinProceso
Alberto J. Suxo Riveros
11
ACM – ICPC Bolivia
Problema C - 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
quieren crear N pares de botas. Afortunadamente la fábrica ha prometido cambiar
cualquier número 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.
Entrada
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.
Salida
Escriba en una línea con el mínimo numero de botas a ser intercambiadas.
Ejemplos de entrada
Ejemplo
3
1 3 1
2 1 3
Ejemplo
2
1 3
2 2
Ejemplo
7
1 2 3 4
2 4 6 1
de entrada 1
de entrada 2
de entrada 3
5 6 7
3 7 5
Ejemplos de salida
Salida para el ejemplo 1
1
Salida para el ejemplo 2
2
Salida para el ejemplo 3
0
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:
5
Alberto J. Suxo Riveros
12
ACM – ICPC Bolivia
Análisis y Solución
Este programa consiste en saber cuántos 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.
Solución
//
//
//
//
//
//
Olimpiada Boliviana De Informatica
Problema : Tienda de Botas
Autor
: Alberto Suxo
Copyright: Team SIM
Lenguaje : Pseudocodigo PSeInt
*******************************
Proceso TiendaDeBotas
Definir n Como Entero;
Definir Izq, Der Como Entero;
Definir i, j, aux, resp Como Entero;
Definir seguir Como Logico;
Dimension Izq[200];
Dimension Der[200];
Leer n;
// Leer todas las botas izquierdas
Para i<-0 Hasta n-1 Hacer
Leer Izq[i];
FinPara
// Leer todas las botas derechas
Para i<-0 Hasta n-1 Hacer
Leer Der[i];
FinPara
resp <- n;
Para i<-0 Hasta n-1 Hacer
seguir <- Verdadero;
Para j<-0 Hasta n-1 Hacer
Si seguir && Izq[i] = Der[j] Entonces
Der[j]<- -1;
resp <- resp - 1;
seguir <- Falso;
FinSi
FinPara
FinPara
Escribir resp;
FinProceso
Alberto J. Suxo Riveros
13
ACM – ICPC Bolivia
Problema D - 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
10
5
1 3 5 7 9
Ejemplos de salida
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:
2004
Solución
//
//
//
//
//
//
Olimpiada Boliviana De Informatica
Problema : Serie Curiosa
Autor
: Alberto Suxo
Copyright: Team SIM
Lenguaje : Pseudocodigo PSeInt
*******************************
Proceso SerieCuriosa
Definir n, d Como Entero;
Definir Nums Como Entero;
Alberto J. Suxo Riveros
14
ACM – ICPC Bolivia
Definir i, datoBase, incr Como Entero;
Dimension Nums[11];
Leer n;
Leer d;
Para i<-0 Hasta d-1 Hacer
Leer Nums[i];
FinPara
datoBase <- n % d;
incr <- n / d;
Si datoBase = 0 Entonces
datoBase <- d;
incr <- incr - 1;
FinSi
Escribir (Nums[datoBase-1] + incr);
FinProceso
Alberto J. Suxo Riveros
15