elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: 1 [2] 3 4
11  Programación / Programación C/C++ / Re: Problemas con scanf() en C en: 19 Febrero 2017, 20:32 pm
Solo tienes que limpiar el buffer
Código
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3.  
  4. float m;
  5. char d;
  6.  
  7. main(){
  8.    printf("Escribe tu valor en metros: ");
  9.    scanf("%f",&m);
  10.    printf("Este es tu valor en pies: %f\n", m * 3.28084);
  11.    printf("\n¿Quieres hacer otra conversion?(S/N): ");
  12.    fflush(stdin);
  13.    scanf("%c", &d);
  14.    if(d == 'S' || d == 's'){
  15.        system("cls");
  16.        return main();
  17.    }
  18.    return 0;
  19. }
  20.  
Te dejo este link para que lo entiendas: http://www.carlospes.com/curso_de_lenguaje_c/01_11_la_funcion_fflush.php
12  Programación / Programación C/C++ / Re: Como esta implementado el Map de la STL? en: 19 Febrero 2017, 18:05 pm
Ivancea, lo único que sabia es que usaba la estructura pair y pensaba que un árbol binario de búsqueda, ahora buscare que es ese árbol binario hilvanado y rojo - negro.
Gracias por responder  ;-)
13  Programación / Programación C/C++ / Como esta implementado el Map de la STL? en: 19 Febrero 2017, 06:47 am
Pues quiero saber que usan (arboles, hash table, etcetera) para hacerlo por mi mismo y hacer unas modificaciones.
Gracias por tu atencion. ;)
14  Programación / Programación C/C++ / Problema de reparticiones de chocolates en: 5 Diciembre 2016, 04:56 am
Hola a todos, pues hoy me encuentro con este problema:

https://omegaup.com/arena/problem/cuanto#problems

L-¿Cuánto nos toca?

Límite de memoria   32MB
Límite de tiempo (caso)   1s   
Límite de tiempo (total)   60s

Descripción
El fin de semana pasado Karel celebró que había obtenido puntaje perfecto en su examen, por lo que hizo una fiesta para autofestejarse. En la fiesta hubo de todo, pero lo que más llamo la atención fueron unas barras de frutas con chocolate.
Al lunes siguiente, Karel planeó darle barras a sus amigos que no fueron invitados a la fiesta. Sin embargo, sus amigos estaban un poco molestos por no haber sido invitados. Como las barras de fruta no tienen la misma cantidad de chocolate , te has metido en un pequeño embrollo para compartirlas:
Para empezar, todos tienen que recibir la misma cantidad de chocolate.
Si alguno de ellos recibe mas chocolate que los demás, entonces se enojarán para siempre contigo.
Siempre puedes partir cualquier barra para darle a uno o más amigos (una parte a cada uno) o inclusive darles una barra completa.
En tu reparto, a cada uno de tus amigos sólo le puedes dar ya sea un único trozo de barra o una barra completa, ya que si alguno de ellos recibe más de un trozo o barra completa (aunque tenga la misma cantidad de chocolate que los demás amigos), también se enojarán contigo.
Para compensar el que no los hayas invitado, quieres darles la mayor cantidad de chocolate, siguiendo las restricciones de arriba, aunque implique que te quedes con barras incompletas y/o completas.
Entrada
En la primera línea habrá dos enteros NN y AA,que indican la cantidad de barras de chocolate y la cantidad de amigos a los que quiere repartir Karel.
En las siguientes NN líneas habrá un entero CiCi que indica la cantidad de chocolate que tiene la barra ii.
Salida
Un único número entero que representa la mayor cantidad de chocolate que les puedes dar a cada uno de tus amigos respetando las restricciones. Nota que es posible darles una cantidad racional de chocolate, pero como no tienes tanta precisión al partir, solo quieres darles cantidades enteras.
Ejemplo
Entrada   Salida   Descripción
2 2
2
2
2
Le das un barra a cada uno de tus amigos.
2 3
7
4
3
Como no es posible darles un pedazo que tenga 4 "unidades" de chocolate, es necesario partir ambas barras (barra [7] -> [3] [3] [1] y barra [4] -> [3] [1]) para que haya 3 pedazos con 3 "unidades" de chocolate y le das una de estas partes a cada uno de tus amigos.
Límites
1 <= NN, AA <= 100000
1 <= CiCi <= 100000

Esta es mi respuesta, la cual me da "Tiempo limite excedido"  y 46.67%:
Código
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4.  
  5.    cin.tie(0);
  6.    ios_base::sync_with_stdio(0);
  7.    int n, amigos, aux, suma = 0, cont;
  8.    cin>>n>>amigos;
  9.    int ar[n];
  10.  
  11.    for(int i = 0; i < n; i++){
  12.        cin>>ar[i];
  13.        suma += ar[i];
  14.    }
  15.  
  16.    int optimo = suma / amigos;
  17.  
  18.    while(optimo){
  19.  
  20.        cont = 0;
  21.        for(int j = 0; j < n; j++)
  22.            cont += ar[j] / optimo;
  23.  
  24.        if(cont >= amigos)
  25.            break;
  26.        else
  27.            optimo--;
  28.    }
  29.    cout<<optimo;
  30.    return 0;
  31. }
  32.  

Si tienes alguna otra idea a la mia, por favor mencionala, me ayudarias mucho...
15  Programación / Programación C/C++ / Re: Juego Gato: definir ganador y repetir coordenada en: 3 Diciembre 2016, 22:12 pm
Hola que tal, hace poco me encargaron en el colegio un proyecto y opte por hacer un gato, eso de usar coordenadas (al momento de ingresarlas) en lo personal es un poco incomodo, espero y te ayude:
Código
  1. /**
  2.     Alumno: Luis Eduardo Garza Medina
  3.     programa: Juego
  4.     Nombre: Gato
  5.  
  6.     El juego posee un menu amigable con el usuario, entendible
  7.     para cualquier usuario.
  8.  
  9.     para el menu solo se usan las teclas: 'i', 'e' y 's';
  10.     y para jugar son los numeros, donde para acceder a una casilla debe presionarse
  11.     el siguiente numero:
  12.  
  13.     1 2 3
  14.     4 5 6
  15.     7 8 9
  16.  
  17.     el jugador uno es representado por un '1' equivalente a X
  18.     el jugador dos es representado por un '2' equivalente a O
  19.  
  20.     Al finalizar el programa, este indica los resultados finales de cada jugador.
  21. */
  22. #include <stdio.h>
  23. #include<windows.h>
  24. #define uno    gato[0][0]
  25. #define dos    gato[0][1]
  26. #define tres   gato[0][2]
  27. #define cuatro gato[1][0]
  28. #define cinco  gato[1][1]
  29. #define seis   gato[1][2]
  30. #define siete  gato[2][0]
  31. #define ocho   gato[2][1]
  32. #define nueve  gato[2][2]
  33. //el compilador sustituye la cadena en #define
  34. short gato[3][3] ={{0,0,0}, //definimos matriz
  35.                   {0,0,0},
  36.                   {0,0,0}};
  37. short won[2]; //definimos array
  38.  
  39. int verifica(){ //comprobamos si un jugador ya ganó
  40.    if(uno == dos && dos == tres)
  41.        return uno;
  42.    if(uno == cuatro && cuatro == siete)
  43.        return uno;
  44.    if(uno == cinco && cinco == nueve)
  45.        return uno;
  46.    if(tres == cinco && cinco == siete)
  47.        return tres;
  48.    if(tres == seis && seis == nueve)
  49.        return tres;
  50.    if(cuatro == cinco && cinco == seis)
  51.        return cuatro;
  52.    if(siete == ocho && ocho == nueve)
  53.        return siete;
  54.    if(dos == cinco && cinco == ocho)
  55.        return dos;
  56.    return 0;
  57. }
  58.  
  59. void mostrar(){ //ponemos en pantalla el gato
  60.    system("cls");
  61.    for(int i = 0; i < 3; i++){
  62.        for(int j = 0; j < 3; j++)
  63.            if(j < 2)
  64.                printf("%d|", gato[i][j]);
  65.            else
  66.                printf("%d", gato[i][j]);
  67.        if(i < 2)
  68.            printf("\n-----\n");
  69.        else
  70.            printf("\n");
  71.    }
  72. }
  73.  
  74. void instrucciones(){ //funcion que muestra las instrucciones del jueo
  75.    system("cls");
  76.    printf("Los controles son los numeros del 1 al 9, por ejemplo:\n\n");
  77.    printf("para acceder a la casilla superior izquierda se presiona 1\n\n");
  78.    printf("para acceder a la casilla inferorior intermedia se presiona 8\n\n");
  79.    system("pause");
  80. }
  81.  
  82. int main (){
  83.    short numero, k;
  84.    char opcion;
  85.    while(1){//while infinito
  86.        system("cls"); //limpia la pantalla
  87.        printf("JUEGO DEL GATO\n\n");
  88.        printf("Menu\n\n");
  89.        printf("presiona 'i' para ver instrucciones:\n");
  90.        printf("Presiona 'e' para comenzar\n");
  91.        printf("Presiona 's' para salir\n\n");
  92.        scanf("%s", &opcion);
  93.        switch(opcion){
  94.            case 'i':
  95.                instrucciones();
  96.            break;
  97.            case 'e':
  98.                memset(gato, 0, sizeof(gato));//inicializa la matriz con valores de 0
  99.                for(k = 1; k <= 9; k++){ //este for se repite 9 veces porque son 9 casillas
  100.                    mostrar();
  101.                    scanf("%d", &numero);
  102.                    if(numero == 1)
  103.                        if(k % 2 == 0) //la operacion del modulo ayuda a determinar de quien es el turno
  104.                            uno = 2;
  105.                        else
  106.                            uno = 1;
  107.                    else if(numero == 2)
  108.                        if(k % 2 == 0)
  109.                            dos = 2;
  110.                        else
  111.                            dos = 1;
  112.                    else if(numero == 3)
  113.                        if(k % 2 == 0)
  114.                            tres = 2;
  115.                        else
  116.                            tres = 1;
  117.                    else if(numero == 4)
  118.                        if(k % 2 == 0)
  119.                            cuatro = 2;
  120.                        else
  121.                            cuatro = 1;
  122.                    else if(numero == 5)
  123.                        if(k % 2 == 0)
  124.                            cinco = 2;
  125.                        else
  126.                            cinco = 1;
  127.                    else if(numero == 6)
  128.                        if(k % 2 == 0)
  129.                            seis = 2;
  130.                        else
  131.                            seis = 1;
  132.                    else if(numero == 7)
  133.                        if(k % 2 == 0)
  134.                            siete = 2;
  135.                        else
  136.                            siete = 1;
  137.                    else if(numero == 8)
  138.                        if(k % 2 == 0)
  139.                            ocho = 2;
  140.                        else
  141.                            ocho = 1;
  142.                    else if(numero == 9)
  143.                        if(k % 2 == 0)
  144.                            nueve = 2;
  145.                        else
  146.                            nueve = 1;
  147.                    int ganador = verifica();//le asignamos a ganador el valor que retorne la funcion verifica
  148.                    if(ganador > 0){
  149.                        mostrar();
  150.                        printf("\nEl jugador %d es el GANADOR", ganador);
  151.                        won[ganador - 1]++; //aumentamos en 1 el contador del ganador
  152.                        break;
  153.                    }
  154.                }
  155.                system("pause>null");
  156.            break;
  157.            case 's':
  158.                system("cls");
  159.                printf("El jugador 1 gano: %d partidas\n", won[0]);
  160.                printf("El jugador 2 gano: %d partidas\n", won[1]);
  161.                printf("Gracias por jugar!\n\n");
  162.                return 0;
  163.            break;
  164.            default:
  165.            break;
  166.        }
  167.    }
  168. }
  169.  
  170.  
16  Programación / Programación C/C++ / Re: Grafos: camino mas corto entre dos nodos[c++] en: 9 Noviembre 2016, 20:38 pm
Gracias por contestar, ya intente eso que me comentas y aun asi me da el mismo resultado
 :-[.
17  Programación / Programación C/C++ / Grafos: camino mas corto entre dos nodos[c++] en: 8 Noviembre 2016, 03:27 am
Dados dos nodos A y V de un grafo, quiero encontrar el camino  (el mas corto) que empiece en A y culmine en V

POR EJEMPLO :



queremos iniciar en el nodo 1 y finalizar en el nodo 3

Entrada:
Dame numero de enlaces: 6
6 4
4 3
4 5
5 1
3 2
2 5
Dame nodo raiz: 1
Dame nodo fin: 3

Salida: 1 5 4 3

Error, lo optimo es: 1, 2, 3

Lo que intente primero fue recorrer a profundidad con recursion, luego con la cola (como el recorrido es por niveles crei que el recorrido seria optimo, pero no)pero ninguno me funciona, me han comentado que puedo hacerlo con backtracking, pero aun no entiendo muy bien esa tecnica y pues si pueden ayudarme, adelante.

Mi codigo
Código
  1. #include<bits/stdc++.h>
  2. #define MAX 1000002
  3. using namespace std;
  4.  
  5. vector<int>ady[MAX];
  6. bool visitado[MAX];
  7. int path[MAX];
  8. int N;
  9.  
  10. //recorrido con recursion
  11. void DFS(int u, int fin){
  12.    path[N++] = u;
  13.    visitado[u] = true;
  14.    for(int v = 0; v < ady[u].size(); ++v)
  15.        if(ady[u][v] == fin){
  16.            path[N++] = fin;
  17.            for(int i = 0; i < N; i++)
  18.                cout<<path[i]<<" ";
  19.            exit(0);
  20.        }
  21.        else if(!visitado[ady[u][v]])
  22.            DFS(ady[u][v], fin);
  23. }
  24.  
  25. //recorrido con cola
  26. void DFS_cola(int u, int fin){
  27.    queue<int>cola;
  28.    cola.push(u);
  29.    while(!cola.empty()){
  30.        int tope = cola.front();
  31.        visitado[tope] = true;
  32.        path[N++] = tope;
  33.        cola.pop();
  34.        for(int v = 0; v < ady[tope].size(); ++v)
  35.            if(ady[tope][v] == fin){
  36.                path[N++] = fin;
  37.                for(int i = 0; i < N; i++)
  38.                    cout<<path[i]<<" ";
  39.                exit(0);
  40.            }
  41.            else if(!visitado[ady[tope][v]])
  42.                cola.push(ady[tope][v]);
  43.    }
  44.  
  45. }
  46.  
  47. int main(){
  48.  
  49.    int n, a, b, m(0);
  50.    cout<<"Dame numero de enlaces: ";
  51.    cin>>n;
  52.  
  53.    for(int i = 0; i < n; i++){
  54.        cin>>a>>b;
  55.        ady[a].push_back(b);
  56.        ady[b].push_back(a);
  57.    }
  58.    int inicial, fin;
  59.    cout<<"Dame nodo raiz: ";
  60.    cin>>inicial;
  61.    cout<<"Dame nodo fin: ";
  62.    cin>>fin;
  63.    //DFS(inicial, fin);
  64.    DFS_cola(inicial, fin);
  65.    return 0;
  66. }
18  Programación / Programación C/C++ / Optimizar algoritmo de búsqueda BFS en: 3 Agosto 2016, 07:01 am
Hola a todos!!
Como algunos sabran estoy aprendiendo busquedas y me he topado con el siguiente problema:
LINK: https://omegaup.com/arena/problem/colosus-Laberinto#problems
O bien aqui lo escribo:

Colosus (Laberinto)

Límite de memoria   32MB
Límite de tiempo (caso)   1s
Límite de tiempo (total)   60s

Descripción

En este problema tu tomas el papel de el gran héroe Colossus tiene la misión de rescatar a la princesa omitilda de un laberinto, pero el maligno pachus quiere matar a la princesa.Lo único con lo que cuentas es con el mapa del laberinto y el tiempo en el que pachus va a llegar a la princesa, por lo que tu tienes que llegar en el menor tiempo posible a ella. El mapa consta de una cuadricula la cual tiene una 'X' en el lugar donde no puedes pasar Una 'C' donde tú te encuentras al principio, y una 'O' donde se encuentra la hermosa omitilda y una 'L' en aquellos lugares donde el campo este libre y puedas pasar.

Problema

Tu tarea consiste en escribir un programa que determine el menor tiempo en el que puedes llegar a rescatar a tu princesa tomando en cuenta que tu te mueves a una velocidad de un cuadro por seg. En caso de que no puedas llegar a salvarla escribirás en la pantalla un -1 en el caso contrario escribirás el tiempo en el que llegaste a ella. en caso de llegar al mismo tiempo considera que la princesa se salva.

Entrada

Tu programa deberá leer del teclado los siguientes datos: En la primera línea los números M, N y T separados por un espacio donde los primeros dos son las dimensiones del laberinto y T el tiempo en que pachus llegara con la princesa. Las siguientes M líneas contendrán N caracteres que representaran el mapa. Donde 3 <= M,N <=1000.

Salida

Tu programa deberá escribir un solo número que represente el tiempo en que llegaste ó -1 en caso de que no hayas llegado.

Ejemplos

Entrada   Salida
5 5 8           6
XXXXX
XCLLX
XXXLX
XOLLX
XXXXX

Consideraciones

Tu programa deberá ejecutarse en un tiempo máximo de 1 segundo.

Lo que yo hago es usar el algoritmo de búsqueda por anchura en un grafo (BFS), desafortunadamente mi respuesta me la 80% porque da limite de memoria podrian explicarme como puedo optimizar este programa por favor?
GRACIAS.
Código
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define MAX 1000
  5. char ady[MAX][MAX];
  6. bool visitado[MAX][MAX];
  7.  
  8. struct Estado{
  9.    int x;
  10.    int y;
  11.    int d;
  12.    Estado(int x1, int y1, int d1) : x(x1), y(y1), d(d1) {}
  13. };
  14.  
  15. int BFS(int x, int y, int h, int w){
  16.    Estado inicial(x,y,0);
  17.    queue<Estado>estados;
  18.    estados.push(inicial);
  19.    memset(visitado, false, sizeof(visitado));
  20.    int dx[4] = {0, 0, 1, -1};
  21.    int dy[4] = {1, -1, 0, 0};
  22.  
  23.    while(!estados.empty()){
  24.        Estado actual = estados.front();
  25.        estados.pop();
  26.        if(ady[actual.x][actual.y] == 'O')
  27.            return actual.d;
  28.        visitado[actual.x][actual.y] = true;
  29.        for(int i = 0; i < 4; i++){
  30.            int nx = dx[i] + actual.x;
  31.            int ny = dy[i] + actual.y;
  32.  
  33.            if(nx >= 0 && nx < h && ny >= 0 && ny < w && ady[nx][ny] != 'X' && !visitado[nx][ny]){
  34.                Estado adyacente(nx, ny, actual.d + 1);
  35.                estados.push(adyacente);
  36.            }
  37.        }
  38.    }
  39.    return -1;
  40. }
  41.  
  42. int main(){
  43.    cin.tie(0);
  44.    ios_base::sync_with_stdio(0);
  45.    int h, w, x, y, t;
  46.    cin>>h>>w>>t;
  47.    for(int i = 0; i < h; i++){
  48.        for(int j = 0; j < w; j++){
  49.            cin>>ady[i][j];
  50.            if(ady[i][j] == 'C'){
  51.                x = i;
  52.                y = j;
  53.            }
  54.        }
  55.    }
  56.    cout<<BFS(x, y, h, w);
  57.    return 0;
  58. }
19  Programación / Programación C/C++ / Re: ¿Mejor algoritmo? Problema con aproximaciones de Grafos en: 28 Julio 2016, 06:40 am
Alberto un pregunta en cuanto a tu video, como te comente ya habia hecho un arbol binario, pero yo en la estructura del nodo solo habia utilizado el dato y los dos punteros izquierdo y derecho, mi pregunta es ¿Para que sirve el nodo padre?
Bueno y otra duda, en tu arbol binario del problema quien es la raiz o como funciona eso de ir añadiendo nodos (disculpa mi ignorancia)?
Mira este es mi codigo:
Código
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct nodoArbol {
  5. struct nodoArbol *ptrIzq;
  6. int dato;
  7. struct nodoArbol *prtDer;
  8. };
  9.  
  10. typedef struct nodoArbol NodoArbol;
  11. typedef NodoArbol *ptrNodoArbol;
  12.  
  13. void insertaNodo( ptrNodoArbol *ptrArbol, int valor ){
  14.  
  15.    if (*ptrArbol == NULL) { /*ARBOL VACIO*/
  16.        *ptrArbol = (NodoArbol*)malloc(sizeof(NodoArbol));
  17.        (*ptrArbol)->dato = valor;
  18.        (*ptrArbol)->ptrIzq = NULL;
  19.        (*ptrArbol)->prtDer = NULL;
  20.    }
  21.  
  22.    else {
  23.        /* el dato a insertar es menor que el dato en el nodo actual */
  24.        if (valor < (*ptrArbol)->dato) {
  25.            insertaNodo(&((*ptrArbol)->ptrIzq), valor);
  26.        }
  27.        else if (valor > (*ptrArbol)->dato) {
  28.            insertaNodo(&((*ptrArbol)->prtDer), valor);
  29.        }
  30.    }
  31. }
  32.  
  33. void inOrden(ptrNodoArbol ptrArbol){
  34.    if (ptrArbol != NULL) {
  35.        inOrden(ptrArbol->ptrIzq);
  36.        cout<<ptrArbol -> dato<<" ";
  37.        inOrden(ptrArbol->prtDer);
  38.    }
  39. }
  40.  
  41. void preOrden(ptrNodoArbol ptrArbol){
  42.    if (ptrArbol != NULL){
  43.        cout<<ptrArbol -> dato<<" ";
  44.        preOrden(ptrArbol->ptrIzq);
  45.        preOrden(ptrArbol->prtDer);
  46.    }
  47. }
  48.  
  49. void postOrden(ptrNodoArbol ptrArbol) {
  50.    if (ptrArbol != NULL){
  51.        postOrden(ptrArbol->ptrIzq);
  52.        postOrden(ptrArbol->prtDer);
  53.        cout<<ptrArbol -> dato<<" ";
  54.    }
  55. }
  56.  
  57. int main(){
  58.  
  59.    ptrNodoArbol ptrRaiz = NULL;
  60.    int limite,elemento;
  61.    cout<<"INTRODUCE CUANTOS ELEMENTOS TENDRA EL ARBOL: ";
  62.    cin>>limite;
  63.  
  64.    for (int i = 1; i <= limite; i++) {
  65.        cout<<"INGRESE ELEMENTO: ";
  66.        cin>>elemento;
  67.        insertaNodo(&ptrRaiz, elemento);
  68.    }
  69.  
  70.    cout<<"\nEL RECORRIDO EN PREORDEN ES:\n";
  71.    preOrden(ptrRaiz);
  72.  
  73.    cout<<"\nEL RECORRIDO EN INORDEN ES:\n";
  74.    inOrden(ptrRaiz);
  75.  
  76.    cout<<"\nEL RECORRIDO EN POSTORDEN ES:\n";
  77.    postOrden(ptrRaiz);
  78.  
  79.    return 0;
  80. }
Gracias por tu ayuda.
20  Programación / Programación C/C++ / Re: Propuestas para resolver problema en C++ en: 28 Julio 2016, 01:09 am
Alberto muchas gracias por compartir tu respuesta y por la propuesta.
Mira la verdad no entiendo mucho el tema de los arboles binarios, solo he creado uno (hace 1 semama aprox.)y pues conozco muy pocas cosas, ademas de que usas cosas nuevas para mi como calloc, strtok , strtol, etc..
Pero me esforzare mucho en tratar de entenderlo.
En cuanto a mi, les comparto mi respuesta ya la envie a la pagina y me da estos resultados:
Status: Tiempo Limite Excedido.
Porcentaje: 90%.
Memoria: 48.98 MB.
Tiempo: >2.78 s.
Como ven es buena respuesta pues me da el 90%.
Y ahora explicare que fue lo que hice:
Después de buscar en internet me encontré con el set que es un contenedor asociativo que tiene la característica de no guardar valores repetidos y los guarda en orden.
entonces aqui reemplazaba los vectores por los sets.
ahora, lo mas complicado es donde se saludan lo explique anteriormente, ahora lo hare mejor:
se saluda 1 y 2.
en el set de 1 pongo el 2.
en el set de 2 pongo el 1.
ahora recorro el set de 1 y a los amigos de 1 les agregare los amigos de 1, lo mismo hago con el 2, pero como ambos sets tienen un solo elemento que son 1 y 2 respectivamente no pasa nada.
se saluda 2 y 3.
en el set de 2 pongo el 3.
en el set de 3 pongo el 2.
ahora recorro el set de 2 y a sus amigos les añado los amigos de 2.
lo mismo hago con el 3.
entonces hasta ahora los sets quedan asi:
persona:                 conocidos:
   1                              2,3
   2                              1,3
   3                              1,2
preguntan 2 conoce a 4 ?
checo, si cualquier set esta vacio (A o B)entonces quiere decir que no, pues no a saludado a nadie, sino recorro el set de la persona A y busco si esta la persona B.
en este caso es NO.
se saluda 4 y 5.
en el set de 4 pongo el 5.
en el set de 5 pongo el 4.
ahora recorro el set de 4 y a los amigos de 4 les agregare los amigos de 4, lo mismo hago con el 5, pero como ambos sets tienen un solo elemento que son 4 y 5 respectivamente no pasa nada.
entonces hasta ahora los sets quedan asi:
persona:                 conocidos:
   1                              2,3
   2                              1,3
   3                              1,2
   4                              5
   5                              4  
ahora preguntan 5 conoce a 3?
checo, si cualquier set esta vacio (A o B) entonces quiere decir que no, pues no a saludado a nadie, sino recorro el set de la persona A y busco si esta la persona B.
en este caso es NO.
Por ultimo se saluda 5 con 1.
en el set de 5 pongo el 1.
en el set de 1 pongo el 5.
ahora recorro el set de 5 y a todos sus amigos les añado los amigos que no tengan de 5, lo mismo hago con el 1 y si nos damos cuenta ya todos son amigos, por ende las siguientes preguntas son SI.
Aqui les dejo el codigo:
Código
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.                            /*DECLARO TODO LO QUE USARE DE SET Y EL VECTOR QUE GUARDARA LAS RESPUESTAS*/
  4. typedef struct arrays{
  5.    set<int>amigos;
  6. }ar;
  7.     set<int>::iterator j;
  8.     set<int>::iterator k;
  9.     vector<string>respuestas;
  10.  
  11. int main(){
  12.    cin.tie(0);
  13.    ios_base::sync_with_stdio(0);
  14.    bool encontrado;
  15.    char opcion;
  16.    int personas, comandos, a, b;
  17.    int i, l, z;
  18.    cin>>personas>>comandos;
  19.  
  20.    ar persona[personas + 1]; /*CREAMOS UN ARRAY DE SETS DE TAMAÑO PERSONAS*/
  21.  
  22.    for(i = 0; i < comandos; i++){
  23.        cin>>opcion>>a>>b;
  24.        if(opcion == 'S'){
  25.            persona[a].amigos.insert(b);
  26.            persona[b].amigos.insert(a);
  27.            for(j = persona[a].amigos.begin(); j != persona[a].amigos.end(); j++){ /* PERSONA A*/
  28.                for(k = persona[a].amigos.begin(); k != persona[a].amigos.end(); k++){
  29.                    persona[*j].amigos.insert(*k);
  30.                }
  31.            }
  32.            for(j = persona[b].amigos.begin(); j != persona[b].amigos.end(); j++){ /*PERSONA B*/
  33.                for(k = persona[b].amigos.begin(); k != persona[b].amigos.end(); k++){
  34.                    persona[*j].amigos.insert(*k);
  35.                }
  36.            }
  37.        }
  38.        else{
  39.            if(persona[a].amigos.empty() || persona[b].amigos.empty())
  40.                respuestas.push_back("0\n");
  41.            else{
  42.                encontrado = false;
  43.                for(j = persona[a].amigos.begin(); j != persona[a].amigos.end(); j++){/*BUSCAMOS SI EN LOS AMIGOS DE A ESTA B*/
  44.                    if(*j == b){
  45.                        encontrado = true;
  46.                        break;
  47.                    }
  48.                }
  49.                if(encontrado)
  50.                    respuestas.push_back("1\n");
  51.                else
  52.                    respuestas.push_back("0\n");
  53.            }
  54.        }
  55.    }
  56.    for(i = 0; i < respuestas.size(); i++)
  57.        cout<<respuestas[i];
  58.    return 0;
  59. }
Creo que si optimizamos la búsqueda de la persona B en A y al agregar amigos podría dar el 100%
Encontre en internet algo llamado set_union y merge para eso de añadir los amigos pero eso de buscar los amigos pensaba en una búsqueda binario aunque según yo que no es posible.
Páginas: 1 [2] 3 4
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines