Olimpiada Cient´ıfica...

24
Estado Plurinacional de Bolivia Olimpiada Cient´ ıfica Estudiantil Olimipiada Boliviana de Inform´atica Solucionario de Examen - Nivel 3 ´ Indice Codigo de Verificaci´ on 2 Trinomios Triangulares 5 Calculadora Inca 7 Palindromes 10 Juego de Canguros 12 Cordillera 14 Eratostenes 17 Examen 19 Quimica 21 Las paginas est´ an numeradas desde el 1 al 23. 20 de mayo de 2012

Transcript of Olimpiada Cient´ıfica...

Estado Plurinacional de Bolivia

Olimpiada Cientıfica Estudiantil

Olimipiada Boliviana de Informatica

Solucionario de Examen - Nivel 3

Indice

Codigo de Verificacion 2

Trinomios Triangulares 5

Calculadora Inca 7

Palindromes 10

Juego de Canguros 12

Cordillera 14

Eratostenes 17

Examen 19

Quimica 21

Las paginas estan numeradas desde el 1 al 23.

20 de mayo de 2012

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 1

Autores

Codigo de Verificacion - Jorge Teran

Trinomios Triangulares - Jorge Teran

Calculadora Inca - Jorge Teran

Palindromes - Jorge Teran

Juego de Canguros - Gabriel Rea

Cordillera - Gabriel Rea

Eratostenes - Hernan Payrumani

Examen - Hernan Payrumani

Quimica - Hernan Payrumani

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 2

Problema - Codigo de Verificacion

DEBE LEER LOS DATOS DE codigoean.in LA SALIDA DEL PROGRAMA SE DEBE GRA-BAR EN salida-codigoean.out

Todos los codigos de barras que han visto en los productos que se venden en los supermer-cados, estan creados bajo la norma EAN, que homogeneiza la numeracion y tiene multiplescaracterısticas:

Puede ser utilizado por fabricantes y distribuidores.

Identifica la unidad del producto de forma biunıvoca (un codigo, un producto).

No es explicativo o significativo: toda la informacion esta contenida en el registro de labase de datos al que se accede con el codigo.

Puede recogerse datos en el punto de venta.

La representacion del codigo EAN se efectua mediante la visualizacion de 13 dıgitos que iden-tifican el producto:

Los dos primeros dıgitos/caracteres corresponden al paıs.

Los cinco caracteres siguientes identifican la empresa fabricante del artıculo.

Los cinco siguientes caracteres es un numero que identifica cada uno de los productos quela empresa produce. La empresa podra poner su propia numeracion de productos.

Por ultimo, el dıgito 13, es un dıgito de control y se calcula mediante una sencillo algoritmomatematico que elimina los errores en la lectura.

El algoritmo para calcular este codigo es como sigue:

Se toman los dıgitos del codigo de izquierda a derecha

Se multiplica los dıgitos impares por 1 comenzando a contar de la izquierda

Se multiplican los dıgitos pares por 3

Se suman los valores

Se halla la resta a la primera decena superior al numero, denominado codigo de verificacion

Como ejemplo consideremos el codigo 841234567890:

Valores 8 4 1 2 3 4 5 6 7 8 9 0multiplicador 1 3 1 3 1 3 1 3 1 3 1 3resultado 8 12 1 6 3 12 5 18 7 24 9 0

Sumamos los valores resultantes 8 + 12 + 1 + 6 + 3 + 12 + 5 + 18 + 7 + 24 + 9 + 0 = 105. Laprimera decena superior al numero es 110, y restamos del valor hallado 110 − 105 = 5. Por lotanto, el dıgito de verificacion es 5.

Su tarea consiste en hallar para cada codigo de 12 dıgitos en la entrada hallar el codigo deverificacion.

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 3

Input

La primera linea contiene el numero de casos de prueba. Las linea siguientes contienen un casode prueba consistente en un numero de doce dıgitos.

Output

Por cada caso de prueba imprima en una linea el codigo de verificacion EAN.

Ejemplos de entrada

4

841234567890

841234567891

851234567893

401234567896

Ejemplos de salida

5

7

0

3

Programa que resuelve el problema

1 #include <iostream>

2 #include <s t r i ng>3 #include <fstream>

4 us ing namespace std ;56 int main ( void ) {7 ofstream f s ( ” sa l i da−codigoean . out” ) ;8 i f s t r e am f e ( ” codigoean . in ” ) ;9 int casos ;10 s t r i n g cad ;11 fe>>casos ;12 int mu l t i p l i c a r = 1 , suma =0, r e s =0;13 for ( int i =0; i<casos ; i++){14 f e >> cad ;15 for ( int j =0; j<cad . l ength ( ) ; j++){16 suma+=(cad . at ( j )− ’ 0 ’ )∗mu l t i p l i c a r ;17 mu l t i p l i c a r = ( mu l t i p l i c a r +2) %4;18 }19 r e s=suma%10;20 i f ( r e s==0)21 f s << 0 << endl ;22 else

23 f s << (10− r e s ) <<endl ;24 }25 return 0 ;26 }

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 4

Explicacion del Programa

El primer paso es convertir el los caracteres leıdos a numeros y esto se hace restando el caractercero. seguidamente. Como explica el enunciado se hace la suma, y los valores a multiplicar se valincrementado de dos en dos modulo cuatro. Al final el ultimo dıgito se obtiene con el modulo10.

Se ha utilizado ofstream para indicar el nombre del archivo de salida y ifstream para espe-cificar el nombre del archivo de entrada. En la programacion orientada a objetos en lugar deusar cin o cout se utiliza los nombres asignados en nuestro caso fe y fs, respectivamente.

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 5

Problema - Trinomios Triangulares

DEBE LEER LOS DATOS DE trinomio.in LA SALIDA DEL PROGRAMA SE DEBE GRA-BAR EN salida-trinomio.out

Consideremos la siguiente expresion:

(1 + x+ x2)n

Dado un valor de n se quiere conocer cual es valor de los coeficientes de la expresion. Porejemplo si n toma el valor de 1 los terminos de la expresion son 1, 1, 1. Cuando n = 2 tenemos1 + 2x+ 3x2 + 2x3 + x4 por lo que la respuesta es 1, 2, 3, 2, 1

Input

La primera linea contiene un numero que indica el numero de casos de prueba. En una lineaviene un caso de prueba que contiene el numero 0 ≤ n ≤ 40 exponente de la expresion.

Output

Por cada caso de prueba su programa debe escribir en una linea y separados por un espacio loscoeficientes del polinomio resultante.

Ejemplos de entrada

3

1

2

0

Ejemplos de salida

1 1 1

1 2 3 2 1

1

Programa que resuelve el problema

1 #include <iostream>

2 #include <s t r i ng>3 #include <fstream>

4 us ing namespace std ;56 int main ( ) {7 ofstream f s ( ” sa l i da−t r inomio . out” ) ;8 i f s t r e am f e ( ” tr inomio . in ” ) ;9 int max=42;10 long long t [max+3] [max∗ 3 ] ;11 t [ 0 ] [ 3+0 ]=1 ;12 t [ 0 ] [ 3+1 ]=1 ;

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 6

13 t [ 0 ] [ 3+2 ]=1 ;14 for ( int i =1; i<max ; i++){15 for ( int j = 3 ; j < max∗3 ; j++) {16 for ( int j 2 = 0 ; j 2 < 3 ; j 2++) {17 t [ i ] [ j ]+=t [ i −1] [ j−j 2 ] ;18 }19 i f ( t [ i ] [ j ]==0) break ;20 }21 }222324 int casos , n ;25 f e >> casos ;26 for ( int j = 0 ; j < casos ; j++) {27 f e >> n ;28 i f (n==−1){29 f s << 1 << endl ;30 }31 else {32 for ( int k = 3 ; t [ n ] [ k ]>0; k++)33 f s << t [ n ] [ k ] << ” ” ;34 f s << endl ;35 }36 }37 return 0 ;38 }

Explicacion del Programa

La solucion esta dada en dos partes. La primera parte es la construccion del trinomio en formasimilar a la forma que construimos un triangulo de Pascal, este triangulo lo denominaremostriangulo trinomial. En la matematica se explica que en los triangulos de Pascal se suman dosnumeros de la iteracion anterior. En los trinomios se suman tres numeros.

La segunda parte es imprimir los coeficientes. Cada fila del triangulos trinomial, contiene loscoeficientes, que son lo que debemos imprimir.

Se ha utilizado ofstream para indicar el nombre del archivo de salida y ifstream para espe-cificar el nombre del archivo de entrada. En la programacion orientada a objetos en lugar deusar cin o cout se utiliza los nombres asignados en nuestro caso fe y fs, respectivamente.

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 7

Problema - Calculadora Inca

DEBE LEER LOS DATOS DE yupana.in LA SALIDA DEL PROGRAMA SE DEBE GRA-BAR EN salida-yupana.out

La Calculadora de los Incas denominada Yupana consiste de una base parecida a la base binaria.Los numeros se representan por varios unos y ceros que se dividen en 4 grupos como se muestra:

00000 000 00 0

Cada grupo representa a un numero especifico y corresponden a los numeros 5, 3, 2, 1. Cuandoqueremos representar un numero simplemente colocamos en 1 en algunos de los 0 de las colum-nas. Por ejemplo para representar el numero 12 escogemos dos numeros de la columna de loscincos y uno de la columna del dos y escribimos:

00011 000 01 0

Un mismo numero puede tener multiples representaciones. La tabla siguiente nuestra variasrepresentaciones y su equivalente decimal.

00000 000 01 0 =200000 000 11 0 =400011 000 00 0 =1000000 011 00 0 =600001 000 00 1 = 6

Hay que hacer notar que hay varias interpretaciones diferentes de una Yupana y esta es una deellas, no hay un consenso sobre el tema.

Input

La primera linea contiene un numero que indica el numero de casos de prueba. Cada caso deprueba contiene una linea con la representacion en el formato de la Yupana que consiste en 11numeros 1 o ceros.

Output

Por cada caso de prueba su programa debe escribir en una linea y separados por un espacio larepresentacion en formato decimal del numero en formato de Yupana.

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 8

Ejemplos de entrada

5

00000000010

00000000110

00011000000

00000011000

00001000001

Ejemplos de salida

2

4

10

6

6

Programa que resuelve el problema

1 #include <algor ithm>

2 #include <iostream>

3 #include <s t r i ng>4 #include <fstream>

5 us ing namespace std ;67 int main ( ) {8 ofstream f s ( ” sa l i da−yupana . out” ) ;9 i f s t r e am f e ( ”yupana . in ” ) ;10 int casos ;11 s t r i n g cad ;12 f e >> casos ;13 for ( int i = 0 ; i < casos ; i++) {14 int uno=0,dos=0, t r e s =0, c inco =0;15 f e >> cad ;16 i f ( cad . at (10)==’ 1 ’ ) uno++;17 i f ( cad . at (9 )==’ 1 ’ ) dos++;18 i f ( cad . at (8 )==’ 1 ’ ) dos++;19 i f ( cad . at (7 )==’ 1 ’ ) t r e s++;20 i f ( cad . at (6 )==’ 1 ’ ) t r e s++;21 i f ( cad . at (5 )==’ 1 ’ ) t r e s++;22 i f ( cad . at (4 )==’ 1 ’ ) c inco++;23 i f ( cad . at (3 )==’ 1 ’ ) c inco++;24 i f ( cad . at (2 )==’ 1 ’ ) c inco++;25 i f ( cad . at (1 )==’ 1 ’ ) c inco++;26 i f ( cad . at (0 )==1) c inco++;27 f s << ( c inco∗5+ t r e s ∗3+dos∗2+uno ) << endl ;28 }29 return 0 ;30 }

Explicacion del Programa

Este programa es muy simple, la notacion de la Yupana es una notacion en base 40. Paraconvertir contamos cuantos elementos hay en el primer grupo, cuantos unos hay en grupo de

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 9

unos, dos, tres y cinco. Luego solo queda multiplicar estas cantidades por uno, dos, tres y cincorespectivamente, se suma y se imprime la respuesta.

Se ha utilizado ofstream para indicar el nombre del archivo de salida y ifstream para espe-cificar el nombre del archivo de entrada. En la programacion orientada a objetos en lugar deusar cin o cout se utiliza los nombres asignados en nuestro caso fe y fs, respectivamente.

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 10

Problema - Palindromes

DEBE LEER LOS DATOS DE palindrome.in LA SALIDA DEL PROGRAMA SE DEBEGRABAR EN salida-palindrome.out

Los palindromes son cadenas que leıdas de izquierda a derecha o de derecha a izquierda soniguales por ejemplo abba.

Se tiene dos caracteres a y b con los cuales deseamos crear cadenas palindromes. Por ejemploababa. Los palindromes se generan en orden alfabetico. Si generamos 16 cadenas palindromesutilizando estos dos caracteres exclusivamente tenemos:

a, aa, aaa, aaaa, aaaaa, aaaaaa, aabaa, aba, ababa, abba, abbba, b, baaaab, baaab, baab, bab

Input

La entrada contiene multiplos casos de entrada. La primera linea contiene el numero de casosde prueba. Cada caso de prueba es una numero (1 ≤ n ≤ 50000) en una linea que indica elnumero de cadena que queremos mostrar. de cada caso de prueba tiene el numero de puntosdel polıgono.

Output

Por cada caso de prueba imprima en una linea la cadena palindrome correspondiente al numerode cadena solicitado.

Ejemplos de entrada

6

1

3

6

10

55

80

Ejemplos de salida

a

aaa

aaaaaa

aaaaaaaaaa

aaaaaaaaaaababbabaaaaaaaaaaa

aaaaaaaaaabaabbbaabaaaaaaaaaa

Programa que resuelve el problema

1 #include <algor ithm>

2 #include <iostream>

3 #include <s t r i ng>4 #include <vector>5 #include <fstream>

6 us ing namespace std ;7

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 11

8 int main ( ) {9 ofstream f s ( ” sa l i da−palindrome . out” ) ;10 i f s t r e am f e ( ”pal indrome . in ” ) ; vector<s t r i ng> a ;11 a . push back ( ”” ) ;12 a . push back ( ”a” ) ;13 a . push back ( ”b” ) ;14 int i =0;15 while ( i < 50000) {16 s t r i n g cad = a [ i ] ;17 a . push back ( ”a”+cad+”a” ) ;18 a . push back ( ”b”+cad+”b” ) ;19 i++;20 }21 s o r t ( a . begin ( ) , a . end ( ) ) ;22 int n , q ;23 f e >> n ;24 for ( i = 0 ; i <n ; i++) {25 f e >> q ;26 f s << a [ q ] << endl ;2728 }29 return 0 ;30 }

Explicacion del Programa

Para hallar todas las cadenas palindromes los que se hace es comenzar con una cadena palindro-me y agregar a ambos lados uno de los caracteres para que sea una nueva cadena palindrome.Por ejemplo se tenemos la letra a le agregamos b a ambos lados obteniendo bab que es tam-bien palindrome. La siguiente cadena seria aaa agregando a en los dos lados. Estas cadenas lasalmacenamos en un vector.

Una vez que tenemos la cantidad de cadenas requeridas en el programa pasamos a la segundaparte. Esto es ordenar las cadenas para que esten en orden lexicografico. Esto es el orden despuesde ordenar utilizando la funcion sort. Pasamos a la tercera parte de programa que es leer elnumero de cadena pedido y imprimir la misma del vector.

Se ha utilizado ofstream para indicar el nombre del archivo de salida y ifstream para espe-cificar el nombre del archivo de entrada. En la programacion orientada a objetos en lugar deusar cin o cout se utiliza los nombres asignados en nuestro caso fe y fs, respectivamente.

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 12

Problema - Juego de Canguros

DEBE LEER LOS DATOS DE canguros.in LA SALIDA DEL PROGRAMA SE DEBE GRA-BAR EN salida-canguros.out

Tres canguros estan jugando en un desierto, Ellos estan jugando sobre una linea de numeros,cada uno ocupando un diferente numero entero, En un movimiento, uno de los canguros queestan fuera, salta dentro del espacio entre los otros dos. En ningun instante debe haber doscanguros en la misma posicion.

Ayudalos a jugar lo mas largo posible.

Input

La entrada consiste en tres enteros A, B y C (0 < A < B < C < 100), las posiciones inicialesde los canguros.

Output

Imprime la cantidad maxima de movimientos que los canguros pueden hacer.

Ejemplos de entrada

2 3 5

3 5 9

Ejemplos de salida

1

3

Programa que resuelve el problema

1 #include <iostream>

2 #include <s t r i ng>34 #include <fstream>

5 us ing namespace std ;6 o fst ream f s ( ” sa l i da−canguros . out” ) ;7 i f s t r e am f e ( ” canguros . in ” ) ;89 int main ( void ) {10 int a , b , c ;11 f e >> a , b , c ;1213 i f ( b−a > c−b )14 f s << (b−a−1 ) << endl ;15 else

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 13

16 f s << ( c−b−1) << endl ;1718 return 0 ;19 }

Explicacion del Programa

Cuando un canguro salta al medio de los otros dos canguros, la cantidad de movimientosposibles es la distancia entre mas grande entre el canguro del medio y los otros dos. Esto sehace restando los numeros en los que se encuentran. Vemos a que lado la distancia es mayor, yesa es la respuesta.

Se ha utilizado ofstream para indicar el nombre del archivo de salida y ifstream para espe-cificar el nombre del archivo de entrada. En la programacion orientada a objetos en lugar deusar cin o cout se utiliza los nombres asignados en nuestro caso fe y fs, respectivamente.

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 14

Problema - Cordillera

DEBE LEER LOS DATOS DE cordillera.in LA SALIDA DEL PROGRAMA SE DEBE GRA-BAR EN salida-cordillera.out

En Bolivia tenemos multiples montanas. Dada los puntos de altura de una imagen simplificada,contar cuantas picos existen en la imagen

Dado que todos los numeros consecutivos son diferentes tenemos los siguientes casos:

a) 1 2 3 b) 3 2 1 c) 1 3 2 d) 2 1 3

En los casos a y b, tenemos una recta pendiente, ası que no podemos contar como un pico enla imagen. El el caso c si tenemos un pico.

/\

/ \

/

En el caso d, no tenemos un pico, sino otra montana que comienza, ası que no lo podemoscontar como un pico.

/

\ /

\/

Entrada

La entrada consiste de varios casos de prueba Q. Cada caso de prueba tiene: El numero depuntos N(N ≤ 1000000), el primero y ultimo tienen el valor 0. Siguen N alturas hi ≥ 0 ≤ 1000.Dos alturas consecutivas son diferentes

Salida

Cuantos picos hay en el grafico

Ejemplos de entrada

1

9

0 10 0 8 0 3 4 5 0

Ejemplos de salida

3

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 15

Programa que resuelve el problema

1 /∗∗2 ∗ @author Gareve3 ∗/4 #include <iostream>

5 #include <c s td io>6 #include <c s t r i ng>7 #include <s t r i ng>8 #include <cmath>9 #include <fstream>

10 #define f o r each ( IT ,C) for ( typeo f (C. begin ( ) ) IT=C. begin ( ) ; IT!=C. end ( ) ;IT++)

11 us ing namespace std ;1213 ofstream f s ( ” sa l i da−c o r d i l l e r a . out” ) ;14 i f s t r e am f e ( ” c o r d i l l e r a . in ” ) ;15 void r e su e l va ( ) {16 int n ;17 f e >> n ;18 int a , b , c ;19 int r e s = 0 ;20 f e >> a ;21 f e >> b ;22 for ( int i =3; i<=n ; i++){23 f e >> c ;24 i f ( a < b and b > c ) //b es un pico25 r e s++;26 a = b ;27 b = c ;28 }29 f s << r e s << endl ;30 }31 int main ( ) {32 int nc ;33 f e >> nc ;34 for ( int i =1; i<=nc ; i++){35 r e su e l va ( ) ;36 }37 }

Explicacion del Programa

Lo primero que hacemos es leer dos valores que corresponden a los dos primeros picos. Se-guidamente hay que leer valores buscando que el valor leıdo sea mayor a anterior y mayoral siguiente. Cada ves que esto ocurre tenemos un pico y lo contamos. Terminado de leer seimprime el numero de picos.

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 16

Se ha utilizado ofstream para indicar el nombre del archivo de salida y ifstream para espe-cificar el nombre del archivo de entrada. En la programacion orientada a objetos en lugar deusar cin o cout se utiliza los nombres asignados en nuestro caso fe y fs, respectivamente.

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 17

Problema - Eratostenes

DEBE LEER LOS DATOS DE eratostenes.in LA SALIDA DEL PROGRAMA SE DEBEGRABAR EN salida-eratostenes.out

La criba de Eratostenes es un famoso algoritmo para buscar todos los numeros primos hastaN . El algoritmo es:

1. Escribir todos los numeros entre 2 y N inclusive.

2. Buscar el menor numero no tachado y llamarlo P , donde P es primo.

3. Dejando fuera P , tachar todos los multiplos que aun no esten tachados.

4. Si todos los numeros no han sido tachados ir al paso 2.

Escribe un programa que dado un numero N yK encuentre elK-esimo entero que sera tachado.

Input

La entrada consiste en dos enteros N y K (2 ≤ K < N ≤ 1000)

Output

Imprimir el K-esimo numero a ser tachado.

Ejemplos de entrada

3

7 3

15 12

10 7

Ejemplos de salida

6

7

9

En el tercer ejemplo, tachamos en el siguiente orden: 2, 4, 6, 8, 10, 3, 9, 5 y 7 el septimo numeroes 9.

Programa que resuelve el problema

1 #include <iostream>

2 #include <s t d i o . h>3 #include <s t r i n g . h>4 #include <fstream>

5 us ing namespace std ;6

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 18

7 #define MAXN 100089 int n , k , casos , s i t o [MAXN+1] ;1011 int s o l v e ( ) {12 for ( int i = 2 ; i <= n ; ++i ) {13 i f ( s i t o [ i ] ) continue ;14 for ( int j = i ; j <= n ; j += i ) {15 i f ( s i t o [ j ] ) continue ;1617 i f ( !−−k ) return j ;18 s i t o [ j ] = 1 ;19 }20 }21 }2223 int main (void ) {24 ofstream f s ( ” sa l i da−e r a t o s t en e s . out” ) ;25 i f s t r e am f e ( ” e r a t o s t en e s . in ” ) ;26 f e >> casos ;27 for ( int i = 0 ; i < casos ; ++i ) {28 f e >> n ;29 f e >> k ;30 memset ( s i t o , 0 , s izeof ( s i t o ) ) ;31 f s << s o l v e ( ) << endl ;32 }33 return 0 ;34 }

Este programa es una variante de la Criba de Eratostenes. Una explicacion detallada esta en ellibro Fundamentos de Programacion que puedes descargar gratuitamente del sitio www.icpc−bolivia.edu.bo. El concepto de tachado y no tachado se logra colocando ceros y unos en unvector.

Los unos significan tachado y los ceros no tachados y corresponden a los numeros primos. Lapregunta es cual es el k-esimo numero que tacharemos. Realizamos el proceso de tachar losnumeros y cuando hemos tachado k numeros imprimimos la respuesta.

Se ha utilizado ofstream para indicar el nombre del archivo de salida y ifstream para espe-cificar el nombre del archivo de entrada. En la programacion orientada a objetos en lugar deusar cin o cout se utiliza los nombres asignados en nuestro caso fe y fs, respectivamente.

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 19

Problema - Examen

DEBE LEER LOS DATOS DE examen.in LA SALIDA DEL PROGRAMA SE DEBE GRA-BAR EN salida-examen.out

Alvaro, Edwin y Gabriel daran un examen para ingresar a un instituto, este instituto tiene lapeculiaridad de siempre realizar examenes de seleccion mutilple.

Desafortunadamente ellos no siempre tienen tiempo de estudiar pero quieren aprovechar que seles dara un examen de seleccion multiple, ya que ellos tienen una teoria sobre estos.

Alvaro dice que tendra mejor nota utilizando la secuencia: A, B, C, A, B, C, A, B, C . . .

Edwin esta convencido de que la mejor secuencia: es B, A, B, C, B, A, B, C, B, A, B, C . . .

Gabriel utilizara la secuencia: C, C, A, A, B, B, C, C, A, A, B, B . . .

Tu tarea es determinar las respuestas correctas para el examen y asi determinar quien de lostres tenia razon con su secuencia, la cual es la que contiene mas respuestas correctas.

Input

La primera linea contiene un entero N (1 ≤ N ≤ 100), la cantidad de preguntas en el examen.La segunda linea contiene una cadena con N letras A’, ’B’. ’CEstas son en orden las respuestascorrectas de las preguntas del examen.

Output

En la primera linea imprime M , la cantidad maxima de respuestas correctas de uno de los tres.Despues imprime los nombres de los chicos en orden alfabetico de quienes tienen M respuestascorrectas.

Ejemplos de entrada

2

5

BAACC

9

AAAABBBBB

Ejemplos de salida

3

Edwin

4

Alvaro

Edwin

Gabriel

Programa que resuelve el problema

1 #include <algor ithm>

2 #include <iostream>

3 #include <s t r i ng>

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 20

4 #include <fstream>

5 us ing namespace std ;67 int main ( ) {8 ofstream f s ( ” sa l i da−examen . out” ) ;9 i f s t r e am f e ( ”examen . in ” ) ;1011 int len , ca sos ;12 f e >> casos ;13 for ( int j =0; j<casos ; ++j ) {1415 s t r i n g s ;16 f e >> l en >> s ;1718 int skor [ 3 ] = {0} ;19 for ( int i =0; i<l en ; ++i ) {20 skor [ 0 ] += s [ i ] == ”ABC” [ i %3];21 skor [ 1 ] += s [ i ] == ”BABC” [ i %4];22 skor [ 2 ] += s [ i ] == ”CCAABB” [ i %6];23 }2425 int naj = max( skor [ 0 ] , max( skor [ 1 ] , skor [ 2 ] ) ) ;26 f s << naj << endl ;27 i f ( skor [ 0 ] == naj ) f s << ”Alvaro” << endl ;28 i f ( skor [ 1 ] == naj ) f s << ”Edwin” << endl ;29 i f ( skor [ 2 ] == naj ) f s << ”Gabr ie l ” << endl ;30 }31 return 0 ;32 }

Primero leemos la secuencia de las respuesta correctas. Hallamos la longitud de la misma. Conesta longitud pasamos a contar cuantas secuencias ABC, BABC, CCAABB hay. Hallamos elmaximo valor de las tres secuencias contadas. La respuesta es el maximo, y los que igualen sonlas personas cuyas secuencias son correctas.

Se ha utilizado ofstream para indicar el nombre del archivo de salida y ifstream para espe-cificar el nombre del archivo de entrada. En la programacion orientada a objetos en lugar deusar cin o cout se utiliza los nombres asignados en nuestro caso fe y fs, respectivamente.

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 21

Problema - Quimica

DEBE LEER LOS DATOS DE quimica.in LA SALIDA DEL PROGRAMA SE DEBE GRA-BAR EN salida-quimica.out

Lucas esta jugando otra vez en la clase de quimica. En vez de estar balanceando ecuaciones elesta escribiendo secuencias codificadas en un papel. Lucas modifica cada palabra adicionandodespues de cada vocal la letra ‘p’y luego la misma vocal de nuevo.

Por ejemplo, el tiene “clase” que llega a convertirse en “clapasepe” y la palabra “juego” llega aconvertirse en “jupuepegopo”. El profesor mira el papel del Lucas con las palabras codificadasy desea saber que escribio.

Escribe un programa que decodifique lo que escribio Lucas.

Input

La entrada consiste de varios casos de prueba. la primera linea contiene el numero de casosde prueba. Cada caso de prueba consiste en una linea que contiene la sentencia codificada. Lasentencia contiene solo letras minusculas y espacios. Las palabras estaran separadas por unsolo espacio y no habra espacios de mas al inicio o al final. La cantidad total de caracteres nosobrepasara los 100.

Output

Imprime la sentencia decodificada en una sola linea.

Ejemplos de entrada

2

zepelepenapa papapripikapa

bapas jepe doposapadgapa opovapa kepemipijapa

Ejemplos de salida

zelena paprika

bas je dosadna ova kemija

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 22

Programa que resuelve el problema

1 #include <c s t r i ng>2 #include <iostream>

3 #include <s t r i ng>45 #include <fstream>

6 us ing namespace std ;789 int main ( ) {10 ofstream f s ( ” sa l i da−quimica . out” ) ;11 i f s t r e am f e ( ”quimica . in ” ) ;12 int casos ;13 char u laz [ 1 0 5 ] ;14 // s t r i n g u l a z ;15 f e >> casos ;16 f e . g e t l i n e ( ulaz , 105) ;1718 for ( int k=0; k<casos ; ++k ) {19 f e . g e t l i n e ( ulaz , 105) ;2021 for ( int i =0; u laz [ i ] != ’ \0 ’ ; ++i ) {22 f s << u laz [ i ] ;23 i f ( s t r c h r ( ” ae iou ” , u laz [ i ] ) != NULL )24 i += 2 ;25 }26 f s << endl ;2728 }29 return 0 ;30 }

1 #include <algor ithm>

2 #include <iostream>

3 #include <s t r i ng>4 #include <fstream>

5 us ing namespace std ;67 int main ( ) {8 ofstream f s ( ” sa l i da−examen . out” ) ;9 i f s t r e am f e ( ”examen . in ” ) ;1011 int len , ca sos ;12 f e >> casos ;13 for ( int j =0; j<casos ; ++j ) {1415 s t r i n g s ;

Web Oficial: http://olimpiada.icpc-bolivia.edu.bo contacto: [email protected] 23

16 f e >> l en >> s ;1718 int skor [ 3 ] = {0} ;19 for ( int i =0; i<l en ; ++i ) {20 skor [ 0 ] += s [ i ] == ”ABC” [ i %3];21 skor [ 1 ] += s [ i ] == ”BABC” [ i %4];22 skor [ 2 ] += s [ i ] == ”CCAABB” [ i %6];23 }2425 int naj = max( skor [ 0 ] , max( skor [ 1 ] , skor [ 2 ] ) ) ;26 f s << naj << endl ;27 i f ( skor [ 0 ] == naj ) f s << ”Alvaro” << endl ;28 i f ( skor [ 1 ] == naj ) f s << ”Edwin” << endl ;29 i f ( skor [ 2 ] == naj ) f s << ”Gabr ie l ” << endl ;30 }31 return 0 ;32 }

Primero leemos una linea de texto esto es fe.getline. Es necesario leer por lineas porque haymas de una palabra en una linea. Como vemos en la explicacion despues de cada vocal se hanagregado dos letras, la p y la vocal anterior. para imprimir la respuesta cada ves que encontramosuna vocal no hay que imprimir los dos caracteres anadidos. Esto se hace agregando 2 en elcontador que recorre el ciclo.

Se ha utilizado ofstream para indicar el nombre del archivo de salida y ifstream para espe-cificar el nombre del archivo de entrada. En la programacion orientada a objetos en lugar deusar cin o cout se utiliza los nombres asignados en nuestro caso fe y fs, respectivamente.