Professional Documents
Culture Documents
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; }
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.
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; }
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(); }
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.
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;
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.
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.
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]
} return 0;
if ( recto(A,B,C) || recto(B,C,A) || recto(C,A,B) ) cout << "SI" << endl; else cout << "NO" << endl;
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;
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()); }