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.