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
#include <stdio.h> #include <stdlib.h> #include <time.h> #define VALORES 100000 typedef struct nodo { int dato; struct nodo *sig; }Nodo; void agregarTarjetas(int x,Nodo **cabeza); void imprimirTarjetas(Nodo *cabeza); void eliminarTarjetas(Nodo *cabeza); Nodo *crearNodo(int x); int main() { int numeroTarjetas,i,x; Nodo *cabeza; cabeza = NULL; do { }while((numeroTarjetas < 1)||(numeroTarjetas > 100)); for(i = 0;i < numeroTarjetas;i++) { agregarTarjetas(x,&cabeza); } imprimirTarjetas(cabeza); eliminarTarjetas(cabeza); imprimirTarjetas(cabeza); return 0; } void agregarTarjetas(int x,Nodo **cabeza) { Nodo *nuevo; nuevo = crearNodo(x); nuevo->sig = *cabeza; *cabeza = nuevo; } Nodo *crearNodo(int x) { Nodo *p; p->dato = x; p->sig = NULL; return p; } void imprimirTarjetas(Nodo *cabeza) { Nodo *ptr; for(ptr = cabeza;ptr!=NULL;ptr = ptr->sig) } void eliminarTarjetas(Nodo *cabeza) { Nodo *ptr1,*ptr2; for(ptr1 = cabeza,ptr2 = ptr1->sig;ptr2!=NULL;ptr2 = ptr2->sig) { if(ptr2->dato < ptr1->dato) ptr1->sig = ptr2->sig; else ptr1 = ptr1->sig; } }
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
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define VALORES 100000 int *ingresarValores(int numeroTarjetas,FILE *fd); void eliminarTarjetas(int tarjetas[],int numeroTarjetas,FILE *fd); int main() { FILE *fd; int numeroTarjetas,*tarjetas; { do { }while((numeroTarjetas < 1)||(numeroTarjetas > 1000)); tarjetas = ingresarValores(numeroTarjetas,fd); eliminarTarjetas(tarjetas,numeroTarjetas,fd); } else return 0; } int *ingresarValores(int numeroTarjetas,FILE *fd) { int i,*buffer; for(i = 0;i < numeroTarjetas;i++) { if((i%10==0)&&(i!=0)) } return buffer; } void eliminarTarjetas(int tarjetas[],int numeroTarjetas,FILE *fd) { int i,j; for(i=0;i < numeroTarjetas;i++) { for(j=i+1;j < numeroTarjetas;j++) { if(tarjetas[j] < tarjetas[i]) tarjetas[i] = -1; } } for(i=0;i < numeroTarjetas;i++) { if(tarjetas[i] != -1) } }
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