You are on page 1of 24

2da Olimpiada Boliviana de Informtica Estado Plurinacional de Bolivia, 15 de agosto de 2012

Contenidos
Contenidos...........................................................................................................................1 Examen de Nivel 2...............................................................................................................2 Problema A: Distancia de Hamming...............................................................................2 Problema B: Hallando nmeros capicas........................................................................4 Problema C: Poema..........................................................................................................6 Problema D: La ltima esperanza....................................................................................8 Problema E: Bolivia Word.............................................................................................11 Examen de Nivel 3.............................................................................................................13 Problema A: Hallando nmeros capicas......................................................................13 Problema B: Flecha ms Larga......................................................................................15 Problema C: ngulos.....................................................................................................17 Problema D: Bolivia Word............................................................................................19 Problema E: La gran bomba de explosin extraa de destruccin masiva Z................21

Examen de Nivel 2
Problema A: Distancia de Hamming
Autor: Jorge Tern La distancia de Hamming entre dos nmeros esta definida como el nmero 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 nmeros 11010 y 01100 difieren en la primera, tercera y cuarta posicin, as que dan una distancia de Hamming de 3. La entrada son cadenas que contienen las representaciones binarias de ciertos nmeros (cada par de nmeros tiene la misma longitud). Debe devolver las distancias de Hamming de todos los pares de nmeros dados.

Entrada
La primera lnea tendr un nmero N, que es la cantidad de casos de prueba. Seguido de N lneas, En cada lnea 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 nmeros contendrn slo los caracteres 1 y 0.

Salida
La salida consiste en una lnea 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

Solucin
/* 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 nmeros capicas


Autor: Jorge Tern Tome un nmero, lo invierte, luego lo suma al nmero original, luego otra vez lo invierte y lo suma. Este proceso se repite hasta que la suma sea capica o se haya hecho 100 sumas. Por ejemplo el 14 lo invertimos y obtenemos 41 sumamos al nmero original obteniendo 55 es capica. Imprimimos 55. Otro ejemplo 95+59=154. Invertimos y sumamos 154+451=605. Repetimos el proceso 605+506=1111 que es capica.

Entrada
La primera fila tendr un nmero N que es el nmero de datos de entrada, seguido de N lneas, cada lnea consiste de un numero entero n 500 un una lnea.

Salida
Por cada nmeros de entrada el numero capica hallado. Si no existe un imprima la palabra imposible.

Ejemplo de entrada 2 14 95 Ejemplo de salida 55 1111

Solucin
/* Problema : Hallando nmeros capicas * 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 ao, en el colegio de Jos se organiza todo un evento por el da de la madre. Comenzar con un himno, coreografas de bailes, una pequea 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 nios.

Entrada
La primera lnea tendr un nmero entero N (0 < N < 1000) que representa el nmero de lneas que tendr el poema. Cada lnea del poema tendr un mximo de 100 caracteres que contendr: mayscula (A-Z), minscula (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

Solucin
/* 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 estn 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 ms 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 nmero de estructuras que sern destruidas dadas las coordenadas del blanco de la bomba nuclear y el radio de alcance de esta.

Entrada
La primera lnea es un entero T (1 T 100) el nmero de casos de prueba. Seguidamente se te dar un entero N (1 N 100) el nmero de coordenadas x, y que te enviar Ghost. A continuacin vendrn N lneas, cada una de 2 valores x, y (0 x, y 1000) donde cada una representa la coordenada de una estructura Protoss. La ltima lnea 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 nmero 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 grfico 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.

Solucin
/* 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 organizacin de la IOI BOLIVIA hizo hacer letras de tamao 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 estn seguros si con las letras restantes podrn armar las palabras que ellos queran. 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 tuviramos las letras O, L, I, B, V, A, Z, T no ser posible armar la palabra BOLIVIA pues no faltara una letra (la letra I). Los organizadores piden tu ayuda. Ellos te darn las letras disponibles y quieren saber si es posible armar la palabra BOLIVIA.

Entrada
La primera lnea contendr un entero N (1 N 10) el nmero de casos de prueba. A continuacin se te dar N lneas, cada una con una cadena (solo maysculas), donde cada carcter 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

Solucin
/* 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;

Examen de Nivel 3
Problema A: Hallando nmeros capicas
Autor: Jorge Tern Tome un nmero, lo invierte, luego lo suma al nmero original, luego otra vez lo invierte y lo suma. Este proceso se repite hasta que la suma sea capica o se haya hecho 100 sumas. Por ejemplo el 14 lo invertimos y obtenemos 41 sumamos al numero original obteniendo 55 es capica. Imprimimos 55. Otro ejemplo 95+59=154. Invertimos y sumamos 154+451=605. Repetimos el proceso 605+506=1111 que es capica.

Entrada
La primera fila tendr un nmero N que es el nmero de datos de entrada, seguido de N lneas, cada lnea consiste de un numero entero n 500 un una lnea.

Salida
Por cada nmeros de entrada el numero capica hallado. Si no existe un imprima la palabra imposible.

Ejemplo de entrada 2 14 95 Ejemplo de salida 55 1111

Solucin
/* Problema : Hallando nmeros capicas * 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 B: Flecha ms Larga


Autor: Jorge Tern En este problema una flecha a la izquierda se define como el carcter < seguido inmediatamente de cero o ms caracteres -. Un flecha doble a la izquierda se define como un carcter < seguido de cero o ms caracteres consecutivos = . Una flecha a la derecha se define como cero o ms caracteres - seguidos del carcter >. Un flecha doble a la derecha se define como cero o ms caracteres = seguidos del carcter >. Dada una cadena se quiere hallar la longitud de la flecha ms larga.

Entrada
La primera lnea contiene un nmero N que son casos de prueba. Cada caso de prueba es una cadena en una lnea. La cadena contiene entre 1 y 50 caracteres. Cada carcter ser <, >, -, =. La entrada termina cuando no hay ms datos.

Salida
Por cada caso de prueba escriba en una lnea la longitud de la cadena ms larga. Si no existe una cadena escriba -1.

Ejemplo de entrada 4 <--->--==> <<<<<<<<<< ----==<----=====> Ejemplo de salida 4 1 -1 6

Solucin
/* Problema : Flecha ms larga * Autor : Alberto Suxo * Copyright: Team SIM * Lenguaje : C++, Ansi-style ******************************/ #include <iostream> #include <string> #define MAX(A,B) (A)>(B)?(A):(B) using namespace std; int main() { int N, i, j, k; string linea; cin >> N; for( k=0; k<N; k++ ) { cin >> linea; int tam = linea.length(), max=-1; for (i=0; i<tam; i++ ) { if (linea[i] == '<') { for (j = i + 1; j < tam && linea[j] == '-'; j++) ; max = MAX(max,j-i); for (j = i + 1; j < tam && linea[j] == '='; j++) ; max = MAX(max,j-i); } else if (linea[i] == '>') { for (j = i - 1; j >= 0 && linea[j] == '-'; j--) ; max = MAX(max,i-j); for (j = i - 1; j >= 0 && linea[j] == '='; j--) ; max = MAX(max,i-j); } } cout << max << endl; } return 0; }

Problema C: ngulos
Autor: Jorge Tern Como responsable de una parte de un sistema de geometra te ha pedido que determinar si hay ngulos rectos. Te dan tres puntos en el plano que forman un triangulo. Lo que debes decir es si hay un ngulo recto en el tringulo que se forma.

Entrada
La entrada consiste de varios casos de prueba, la primera lnea contiene el nmero de casos n. Por cada caso se tiene una lnea con las coordenadas de los tres puntos X, Y, Z que forman un tringulo. Cada punto tiene dos enteros con las coordenadas del eje (-1000 x, y 1000). Todos los nmeros caben en una variable entera.

Salida
Imprima una lnea con el texto SI cuando uno de los 3 ngulos es recto y NO cuando ninguno es un ngulo recto.

Ejemplo de entrada 4 -4 -5 8 0 -5 -3 -4 -4 3 3 -5 -3 -4 -3 8 7 -5 -2 -4 -2 5 7 -5 -1 Ejemplo de salida NO SI NO SI

Solucin
/* Problema : Angulos * Autor : Alberto Suxo * Copyright: Team SIM * Lenguaje : C++, Ansi-style ******************************/ #include <iostream> #define #define #define typedef x 0 y 1 DIM 2 long punto[DIM];

using namespace std; bool recto( punto A, punto B, punto C ) { punto V1, V2; // En realidad esto es un vector :-D V1[x] = B[x] - A[x]; V1[y] = B[y] - A[y]; V2[x] = C[x] - A[x]; V2[y] = C[y] - A[y]; return (V1[x] * V2[x] + V1[y] * V2[y]) == 0; } int main() { int N, i; punto A, B, C; cin >> N; for( i=0; i<N; { cin >> A[x] cin >> B[x] cin >> C[x]

i++ ) >> A[y]; >> B[y]; >> C[y];

} return 0;

if ( recto(A,B,C) || recto(B,C,A) || recto(C,A,B) ) cout << "SI" << endl; else cout << "NO" << endl;

Problema D: Bolivia Word


Autor: Alvaro Rojas La organizacin de la IOI BOLIVIA hizo hacer letras de tamao 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 estn seguros si con las letras restantes podrn armar las palabras que ellos queran. 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 tuviramos las letras O, L, I, B, V, A, Z, T no ser posible armar la palabra BOLIVIA pues no faltara una letra (la letra I). Los organizadores piden tu ayuda. Ellos te darn las letras disponibles y quieren saber si es posible armar la palabra BOLIVIA.

Entrada
La primera lnea contendr un entero N (1 N 10) el nmero de casos de prueba. A continuacin se te dar N lneas, cada una con una cadena (solo maysculas), donde cada carcter 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

Solucin
/* 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;

Problema E: La gran bomba de explosin extraa de destruccin masiva Z


Autor: Gabriel Rea La plaga zombie ha ido ganando a la humanidad en la gran guerra Z. Ahora que la humanidad ha despertado de su estupor inicial frente al inicio del apocalipsis Zombie, lleg la hora del contraataque! Tu equipo est evaluando diferentes armas de destruccin masiva, en este caso, bombas creadas por cientficos de poca cordura. Estas bombas crean explosiones rectangulares!, muy efectivas en entornos urbanos.

Los cientficos han ofrecido a tu equipo una cantidad N de bombas rectangulares anti zombie de diferentes tipos. En este momento se encuentran en la etapa de preparacin de los lugares en los que las bombas llegaran a formar una explosin ms efectiva que nos libre de la infestacin zombie. Dada una posible locacin de las explosiones, determinar cual es el rea total cubierta por las explosiones. En la figura 1 se puede ver que el rea de las 4 explosiones es de 30 (unidades cuadradas).

Entrada
La entrada comienza con un nmero NC, el nmero de casos de prueba. Por cada caso de prueba: El nmero N (1 N 100) de bombas rectangulares. A continuacin, siguen N lneas, cada una con la descripcin de un rectngulo. La descripcin consiste en 4 nmeros enteros ax, ay, bx, by que representan 2 puntos a, b: las esquinas inferior izquierda y superior derecha respectivamente. 0 ax < bx 1000000 0 ay < by 1000 Todos los rectngulos son vlidos (no existirn rectngulos de rea cero).

Salida
Por cada caso de entrada, imprimir el nmero de caso seguido del nmero mximo de zombies que se pueden destruir con los disparos del can laser.

Ejemplo de entrada 4 1 1 1 2 2 2 1 1 3 3 1 1 2 2 2 1 1 3 3 2 2 4 4 2 1 1 10000000 3 5000000 2 10000000 4 Ejemplo de salida Caso #1: 1 Caso #2: 4 Caso #3: 7 Caso #4: 2499998 Solucin
/* Problema : La gran bomba... * Autor : Gabriel Rea * Lenguaje : C++, Ansi-style ******************************/ #define DEBUGs #ifndef NDEBUG #define DBG(a) cout<<__LINE__<<": "<<#a<<"= "<<a<<endl; #else #define DBG(a) ; #endif #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <algorithm> #include <cstring> #include <cassert> #include <cmath> #define foreach(IT,C) for(typeof(C.begin())IT=C.begin();IT! =C.end();IT++) #define P pair<int,int> using namespace std;

class Rectangle{public: int ax,ay,bx,by; Rectangle(){} }; int n; vector<Rectangle> rec; vector<P > vc; const int oo = 10000000; int suma_intervalos() { assert(vc.size() > 0); int res = 0; vc.push_back(P(oo,oo)); //ordena primero por first, luego por second sort(vc.begin(), vc.end()); int a = vc[0].first,b = vc[0].second; for(int i=1;i<vc.size();i++) { if(b < vc[i].first) { res += (b - a); a = vc[i].first; b = vc[i].second; } else { b = max(b,vc[i].second); } } return res; } bool esta_en_y(int y,int r) { return rec[r].ay <= y and }

y < rec[r].by ;

int area_en_y(int y) { int res = 0; vc.clear(); for(int i=0;i<n;i++) if(esta_en_y(y,i)) vc.push_back(P(rec[i].ax,rec[i].bx)); if(vc.empty()) return 0; } return suma_intervalos();

int resuelva() { scanf( "%d", &n ); rec.resize(n); for(int i=0;i<n;i++) { scanf("%d %d %d %d", &rec[i].ax, &rec[i].ay, &rec[i].bx, &rec[i].by); assert(rec[i].ax <= rec[i].bx); assert(rec[i].ay <= rec[i].by); } int res = 0; for(int y=0;y<=1000;y++) res += area_en_y(y); } return res;

int main() { int nc; scanf( "%d", &nc ); for(int i=1;i<=nc;i++) printf("Caso #%d: %d\n",i,resuelva()); }

You might also like