Problema B

Anuncio
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;
}
Descargar