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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  programa tarjetas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: programa tarjetas  (Leído 2,076 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
programa tarjetas
« en: 9 Noviembre 2013, 06:02 am »

Saludos

Tengo el siguiente programa que dice:

Tengo n tarjetas numeradas en cierto orden(al azar), y hay que eliminar algunas de esas tarjetas, de tal forma que las que queden esten ordenadas ascendentemente,  y cuyos valores esten entre el rango 1 <= valores <= 100,000, esto ya lo codifique pero el problema que tengo es que me pide encontrar el menor numero de tarjetas que se pueden eliminar y es lo que no entiendo como hacerlo, o sea que tengo que buscar todas las posibilidades y despues verificar cual es la que puede eliminar el menor numero de tarjetas?? el codigo es el siguiente:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define VALORES 100000
  5.  
  6. typedef struct nodo
  7. {
  8.    int dato;
  9.    struct nodo *sig;
  10. }Nodo;
  11.  
  12. void agregarTarjetas(int x,Nodo **cabeza);
  13. void imprimirTarjetas(Nodo *cabeza);
  14. void eliminarTarjetas(Nodo *cabeza);
  15. Nodo *crearNodo(int x);
  16.  
  17.  
  18. int main()
  19. {
  20.    int numeroTarjetas,i,x;
  21.    Nodo *cabeza;
  22.    cabeza = NULL;
  23.    srand(time(NULL));
  24.    do
  25.    {
  26.        printf("Dame numero de tarjetas: ");
  27.        scanf("%d",&numeroTarjetas);
  28.        system("cls");
  29.    }while((numeroTarjetas < 1)||(numeroTarjetas > 100));
  30.    for(i = 0;i < numeroTarjetas;i++)
  31.    {
  32.        x = rand()% VALORES+1;
  33.        agregarTarjetas(x,&cabeza);
  34.    }
  35.    printf("Archivo original\n");
  36.    imprimirTarjetas(cabeza);
  37.    eliminarTarjetas(cabeza);
  38.    printf("despues\n");
  39.    imprimirTarjetas(cabeza);
  40.    return 0;
  41. }
  42.  
  43. void agregarTarjetas(int x,Nodo **cabeza)
  44. {
  45.    Nodo *nuevo;
  46.    nuevo = crearNodo(x);
  47.    nuevo->sig = *cabeza;
  48.    *cabeza = nuevo;
  49. }
  50.  
  51. Nodo *crearNodo(int x)
  52. {
  53.    Nodo *p;
  54.    p = (Nodo*)malloc(sizeof(Nodo));
  55.    p->dato = x;
  56.    p->sig = NULL;
  57.    return p;
  58. }
  59.  
  60. void imprimirTarjetas(Nodo *cabeza)
  61. {
  62.    Nodo *ptr;
  63.    for(ptr = cabeza;ptr!=NULL;ptr = ptr->sig)
  64.       printf("[%d]",ptr->dato);
  65. }
  66.  
  67. void eliminarTarjetas(Nodo *cabeza)
  68. {
  69.    Nodo *ptr1,*ptr2;
  70.    for(ptr1 = cabeza,ptr2 = ptr1->sig;ptr2!=NULL;ptr2 = ptr2->sig)
  71.    {
  72.        if(ptr2->dato < ptr1->dato)
  73.           ptr1->sig = ptr2->sig;
  74.        else
  75.           ptr1 = ptr1->sig;
  76.    }
  77. }
  78.  

esta la hice con listas con apuntadores porque pense que seria mas facil hacer las eliminaciones, aunque tambien lo habia hecho de esta otra manera, y las dos funcionan solo que no se como hacer un algoritmo que me determine cual es el menor numero de tarjetas que se pueden eliminar

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #define VALORES 100000
  6.  
  7. int *ingresarValores(int numeroTarjetas,FILE *fd);
  8. void eliminarTarjetas(int tarjetas[],int numeroTarjetas,FILE *fd);
  9.  
  10. int main()
  11. {
  12.    FILE *fd;
  13.    int numeroTarjetas,*tarjetas;
  14.    srand(time(NULL));
  15.    if((fd = fopen("F:\\Archivo_Analisis_Algoritmos.txt","w"))!= NULL)
  16.    {
  17.        do
  18.        {
  19.            printf("Dame el numero de tarjetas: ");
  20.            scanf("%d",&numeroTarjetas);
  21.            system("cls");
  22.        }while((numeroTarjetas < 1)||(numeroTarjetas > 1000));
  23.        fprintf(fd,"Archivo de Texto:\n\n");
  24.        tarjetas = ingresarValores(numeroTarjetas,fd);
  25.        eliminarTarjetas(tarjetas,numeroTarjetas,fd);
  26.    }
  27.    else
  28.       printf("No se pudo crear archivo\n");
  29.    return 0;
  30. }
  31.  
  32. int *ingresarValores(int numeroTarjetas,FILE *fd)
  33. {
  34.    int i,*buffer;
  35.    buffer = (int*)malloc(numeroTarjetas*sizeof(int));
  36.    for(i = 0;i < numeroTarjetas;i++)
  37.    {
  38.        buffer[i] = rand()% VALORES+1;
  39.        printf("[%d]",buffer[i]);
  40.        fprintf(fd,"%d,",buffer[i]);
  41.        if((i%10==0)&&(i!=0))
  42.           fprintf(fd,"\n");
  43.    }
  44.    return buffer;
  45. }
  46.  
  47. void eliminarTarjetas(int tarjetas[],int numeroTarjetas,FILE *fd)
  48. {
  49.    int i,j;
  50.    for(i=0;i < numeroTarjetas;i++)
  51.    {
  52.        for(j=i+1;j < numeroTarjetas;j++)
  53.        {
  54.            if(tarjetas[j] < tarjetas[i])
  55.               tarjetas[i] = -1;
  56.        }
  57.    }
  58.    fprintf(fd,"\n\nTarjetas eliminadas\n");
  59.    for(i=0;i < numeroTarjetas;i++)
  60.    {
  61.        if(tarjetas[i] != -1)
  62.           fprintf(fd,"[%d]",tarjetas[i]);
  63.    }
  64.  
  65. }
  66.  

por ejemplo si tengo los numeros [11,500][22,924][13,449][21,933][13,150][1,858][11,516], se que el menor numero de eliminaciones serian 4, y quedaria asi:

[11,500][13,449][21,933], pero trate de buscarle la logica y no supe como

de antemano gracias


« Última modificación: 9 Noviembre 2013, 06:05 am por m@o_614 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: programa tarjetas
« Respuesta #1 en: 9 Noviembre 2013, 15:59 pm »

Tengo el siguiente programa que dice:

Tengo n tarjetas numeradas en cierto orden(al azar), y hay que eliminar algunas de esas tarjetas, de tal forma que las que queden esten ordenadas ascendentemente,  y cuyos valores esten entre el rango 1 <= valores <= 100,000, esto ya lo codifique pero el problema que tengo es que me pide encontrar el menor numero de tarjetas que se pueden eliminar y es lo que no entiendo como hacerlo
El problema que te piden resolver es Wikipedia: Longest increasing subsequence

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: programa tarjetas
« Respuesta #2 en: 11 Noviembre 2013, 00:31 am »

muchas gracias rir3760 por tu respuesta, estuve leyendo el enlace que pusiste y ahi dice que se puede resolver el problema utilizando solamente arrays y busqueda binaria, pero que la busqueda binaria no es solo para los array ordenados?? o sea que tengo antes que nada ordenar el vector y despues realizar la busqueda binaria del elemento menor del arreglo?? el parrafo dice:

procesa la secuencia de elementos en orden, manteniendo la subsecuencia de incrementos mas larga obtenida hasta ahora. Aqui no se a que se refiere con subsecuencia obtenida, obtenida cuando?? si hasta ahora solo se ha ordenado el arreglo

de nuevo gracias
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Programa para hacer tarjetas!?
Diseño Gráfico
sorez 3 2,830 Último mensaje 15 Mayo 2004, 09:42 am
por kåhjî£
Programa para hacer tarjetas o invitaciones a una fiesta
Diseño Gráfico
-N4N0- 2 23,479 Último mensaje 15 Marzo 2005, 19:46 pm
por D_Mu
Programa lector de tarjetas
Software
Meta 1 3,885 Último mensaje 12 Mayo 2010, 20:18 pm
por Meta
Tarjetas NFC y tarjetas blancas
Dispositivos Móviles (PDA's, Smartphones, Tablets)
javy97 0 2,220 Último mensaje 16 Julio 2013, 17:21 pm
por javy97
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines