2da Olimpiada Boliviana de Informática Estado Plurinacional de Bolivia, 15 de agosto de 2012 Contenidos Examen de Nivel 2 .............................................................................................................. 2 Problema A: Distancia de Hamming .............................................................................. 2 Problema B: Hallando números capicúas ....................................................................... 4 Problema C: Poema......................................................................................................... 6 Problema D: La última esperanza ................................................................................... 8 Problema E: Bolivia Word ............................................................................................ 11 Examen de Nivel 2 Problema A: Distancia de Hamming Autor: Jorge Terán La distancia de Hamming entre dos números esta definida como el número de posiciones en sus representaciones binarias en las que difieren. Los ceros a la izquierda son usados si son necesarios para que a las representaciones binarias tengan misma longitud. Por ejemplo, los números 11010 y 01100 difieren en la primera, tercera y cuarta posición, así que dan una distancia de Hamming de 3. La entrada son cadenas que contienen las representaciones binarias de ciertos números (cada par de números tiene la misma longitud). Debe devolver las distancias de Hamming de todos los pares de números dados. Entrada La primera línea tendrá un número N, que es la cantidad de casos de prueba. Seguido de N líneas, En cada línea se vienen dos cadenas con las representaciones binarias separadas por un espacio. Cada cadena tendrá entre 1 y 50 caracteres, inclusive. Todos los elementos de números contendrán sólo los caracteres 1 y 0. Salida La salida consiste en una línea para cada caso de prueba que contiene la distancia Hamming. Ejemplo de entrada 3 11010 01100 10000001 10000001 11111111 00000000 Ejemplo de salida 3 0 8 Solución /* Problema : Distancia de Hamming * Autor : Alberto Suxo * Copyright: Team SIM * Lenguaje : C++, Ansi-style ******************************/ #include <iostream> #include <string> using namespace std; int main() { int N, i, j, cnt; string a, b; cin >> N; for( i=0; i<N; i++ ) { cin >> a >> b; cnt = 0; for( j=0; j<a.length(); j++ ) { if( a[j] != b[j] ) cnt ++; } cout << cnt << endl; } return 0; } Problema B: Hallando números capicúas Autor: Jorge Terán Tome un número, lo invierte, luego lo suma al número original, luego otra vez lo invierte y lo suma. Este proceso se repite hasta que la suma sea capicúa o se haya hecho 100 sumas. Por ejemplo el 14 lo invertimos y obtenemos 41 sumamos al número original obteniendo 55 es capicúa. Imprimimos 55. Otro ejemplo 95+59=154. Invertimos y sumamos 154+451=605. Repetimos el proceso 605+506=1111 que es capicúa. Entrada La primera fila tendrá un número N que es el número de datos de entrada, seguido de N líneas, cada línea consiste de un numero entero n ≤ 500 un una línea. Salida Por cada números de entrada el numero capicúa hallado. Si no existe un imprima la palabra imposible. Ejemplo de entrada 2 14 95 Ejemplo de salida 55 1111 Solución /* Problema : Hallando números capicúas * Autor : Alberto Suxo * Copyright: Team SIM * Lenguaje : C++, Ansi-style ******************************/ #include <iostream> using namespace std; long invertir( long a ) { long aux = 0; while( a > 0 ) { aux = aux*10 + a%10; a = a / 10; } return aux; } int main() { int N, i, cnt; long A, B; cin >> N; for( i=0; i<N; i++ ) { cin >> A; cnt = 0; while( cnt < 100 ) { B = invertir( A ); if( A == B ) { cout << A << endl; break; } else A = A + B; cnt ++; } if( cnt == 100 ) cout << "imposible" << endl; } return 0; } Problema C: Poema Autor: Alberto Suxo Como cada año, en el colegio de José se organiza todo un evento por el día de la madre. Comenzará con un himno, coreografías de bailes, una pequeña obra de teatro, una banda de estudiantes tocará un tema especialmente dedicado y, por último, un poema, (a cargo de José). Pero, José esta muy nervioso, ha hecho todo lo posible para memorizar el poema. Sus amigos decidieron ayudar a José quitando todas las vocales del poema y remplazarlos por guiones, luego dejaron que José lo lea para ver si realmente lo ha memorizado todo. El problema es que los amigos de José quieren estar seguros de remplazarlos bien sin arruinar el poema, para lo cual decidieron hacerlo mediante un programa. Tu trabajo es ayudar a estos niños. Entrada La primera línea tendrá un número entero N (0 < N < 1000) que representa el número de líneas que tendrá el poema. Cada línea del poema tendrá un máximo de 100 caracteres que contendrá: mayúscula (A-Z), minúscula (a-z), espacios ( ), puntos (.) y comas (,). Salida En la salida se mostrará el poema sin vocales como se muestra en el ejemplo de salida. Ejemplo de entrada 5 Creci de a poco con tu calor, me alimentaba con tus caricias y frases de amor. Con miedo de perderte... Se hizo la luz Ejemplo de salida Cr-c- d- - p-c- c-n t- c-l-r, m- -l-m-nt-b- c-n t-s c-r-c--s y fr-s-s d- -m-r. C-n m--d- d- p-rd-rt-... S- h-z- l- l-z Solución /* Problema : Poema * Autor : Alberto Suxo * Copyright: Team SIM * Lenguaje : C, Ansi-style ******************************/ #include<stdio.h> #include<ctype.h> int esVocal( char ch ) { char c = tolower( ch ); return ( c =='a' || c=='e' || c=='i' || c=='o' || c=='u' ); } int main() { int n, i; char line[101]; scanf( "%d\n", &n ); while( n-- ) { gets( line ); for( i=0; line[i]; i++ ) if( esVocal( line[i] ) ) line[i] = '-'; printf( "%s\n" , line ); } return 0; } Problema D: La última esperanza Autor: Alvaro Rojas Los Terrans están siendo atacados por los Protoss una raza de Humanoides que aparecen en la serie Star Craft. Los Terrans ya casi sin tropas y con poca estructuras solo tienen una esperanza para vencer en esta guerra contra los Protoss. Y esa esperanza es poder usar el arma más poderosa que tienen, “la Bomba Nuclear”. Entonces necesitan un soldado para poder marcar el blanco para el ataque nuclear a los Protoss, el cual es Ghost, un soldado capaz de volverse invisible y poder infiltrarse en la base de los Protoss. Ghost se dirige hacia la Base de los Protoss y logra infiltrarse en ella para poder marcar el blanco del ataque Nuclear. Ghost está indeciso para marcar el blanco para el ataque Nuclear así que los Terrans piden tu ayuda. Ghost te enviara coordenadas de cada estructura de la base Protoss. Así que él quiere saber el número de estructuras que serán destruidas dadas las coordenadas del blanco de la bomba nuclear y el radio de alcance de esta. Entrada La primera línea es un entero T (1 ≤ T ≤ 100) el número de casos de prueba. Seguidamente se te dará un entero N (1 ≤ N ≤ 100) el número de coordenadas x, y que te enviará Ghost. A continuación vendrán N líneas, cada una de 2 valores x, y (0 ≤ x, y ≤ 1000) donde cada una representa la coordenada de una estructura Protoss. La última línea tendrá 3 valores x, y, r. Donde x, y son las coordenadas del blanco del ataque nuclear y r (1 ≤ r ≤ 500) el radio de alcance de la bomba Nuclear. Salida Para cada caso de prueba imprimir el número de estructuras Potross destruidas por la bomba Nuclear (Una estructura será destruida si la coordenada de la estructura Protoss está en el radio de alcance de la Bomba Nuclear) Ejemplo de entrada 3 2 1 1 1 0 0 0 1 2 1 1 1 0 0 0 5 2 0 0 50 50 5 5 10 Ejemplo de salida 1 2 1 El gráfico corresponde al primer caso de prueba, donde claramente podemos notar que el alcance del radio de la bomba nuclear llega a tocar el punto (1, 0) (Pues la distancia del punto de la estructura Protoss a la bomba es menor o igual al radio de alcance de la bomba), por lo tanto la Bomba destruye una estructura, en cambio la estructura que se encuentra en el punto (1, 1) no es alcanzada por la bomba Nuclear. Solución /* Problema : La última esperanza * Autor : Alvaro Rojas * Lenguaje : C++, Ansi-style ******************************/ #include <cstdio> #include <iostream> #include <vector> #include <cmath> using namespace std; int t; double distancia(pair<double, double> a, pair<double, double> b ) { double xx = (a.first - b.first) * (a.first - b.first); double yy = (a.second - b.second) * (a.second - b.second); return sqrt(xx + yy); } void resolve() { vector<pair<double, double> > estructuras; int n; scanf( "%d", &n ); for(int i=0;i<n;i++) { double x, y; cin >> x >> y; estructuras.push_back(make_pair<double, double>(x, y)); } pair<double, double> bombaNuclear; double radio; cin >> bombaNuclear.first >> bombaNuclear.second >> radio; //Revisar todos los puntos x,y int res = 0; for(int i=0;i<estructuras.size(); i++) { double dist = distancia(estructuras[i], bombaNuclear); if(distancia(estructuras[i], bombaNuclear) <= radio) { res++; } } printf( "%d\n", res ); } int main() { scanf( "%d", &t ); for(int i=0; i<t; i++) resolve(); } Problema E: Bolivia Word Autor: Alvaro Rojas La organización de la IOI BOLIVIA hizo hacer letras de tamaño grande, para poder ponerlas en varios lugares del evento. Mientras transportaban el paquete que almacenaba las letras este se rompió y dejo caer las letras, al caer las letras varias de estas se perdieron. Así que ellos no están seguros si con las letras restantes podrán armar las palabras que ellos querían. Por ejemplo si tenemos las letras O, I, L, I, B, V, A, Z, T y queremos armar la palabra BOLIVIA, notaremos claramente que es posible armarla. En cambio si tuviéramos las letras O, L, I, B, V, A, Z, T no será posible armar la palabra BOLIVIA pues no faltaría una letra (la letra I). Los organizadores piden tu ayuda. Ellos te darán las letras disponibles y quieren saber si es posible armar la palabra BOLIVIA. Entrada La primera línea contendrá un entero N (1 ≤ N ≤ 10) el número de casos de prueba. A continuación se te dará N líneas, cada una con una cadena (solo mayúsculas), donde cada carácter representa la letra disponible para armar la palabra BOLIVIA. Salida Para cada cadena que se te dio anteriormente, si es posible armar la palabra BOLIVIA imprimir “ES POSIBLE”, caso contrario “NO ES POSIBLE”'. Ejemplo de entrada 3 BOLIVIA BOOIILVA BOLVZATY Ejemplo de salida ES POSIBLE ES POSIBLE NO ES POSIBLE Solución /* Problema : Bolivia Word * Autor : Alberto Suxo * Copyright: Team SIM * Lenguaje : C++, Ansi-style ******************************/ #include <iostream> #include <string> using namespace std; int main() { int N, i, j; string linea; int B, O, L, I, V, A; cin >> N; for( i=0; i<N; i++ ) { cin >> linea; B = O = L = I = V = A = 0; for( j=0; j<linea.length(); j++ ) { switch( linea[j] ) { case 'B': B++; break; case 'O': O++; break; case 'L': L++; break; case 'I': I++; break; case 'V': V++; break; case 'A': A++; break; } } if( B<1 || O<1 || L<1 || I<2 || V<1 || A<1 ) cout << "NO ES POSIBLE" << endl; else cout << "ES POSIBLE" << endl; } return 0; }