Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- autor: Jean Rodriguez H.
- fecha: Sabado 4 de Noviembre, 2017
- nombre del programa: collar de perlas
- descripcion: cada linea corresponde a un caso distinto, en el que se ingresa el tamaño de unas perlas (hasta ingresar un 0). el programa
- analiza la capacidad de crear un collar simetrico con las perlas de acuerdo a su tamaño y muestra el orden por pantalla.
- el programa finaliza con una linea con un 0. ejemplo:
- input output
- 2 3 2 3 5 7 5 0 2 3 5 7 5 3 2
- 2 2 7 10 0 NO
- 10 0 10
- 1 1 1 1 1 0 1 1 1 1 1
- 1 2 1 2 1 1 3 0 1 1 2 3 2 1 1
- 0
- */
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct perla{
- int tamano; //tamaño de la perla
- long long cantidad; //cantidad de perlas (segun el tamaño)
- }perla;
- void reparar(unsigned long long *collar, unsigned long long total); //se crea el collar simetrico de ser posible
- int compara(const void *a, const void *b);
- int main(void)
- {
- unsigned long long n; //tamaño de la primera perla de cada caso
- scanf("%llu",&n);
- //finaliza cuando la primera perla de cada caso es de tamaño 0
- while(n)
- {
- unsigned long long *collar = NULL; //collar de perlas a ordenar de forma simetrica
- unsigned long long total = 0; //total de perlas en cada caso
- /* se guardan las siguientes perlas hasta que aparezca un 0*/
- while(n) {
- collar = (unsigned long long *)realloc(collar, sizeof(unsigned long long)*(total+1));
- if(collar == NULL) {
- printf("Operacion fallida");
- EXIT_FAILURE;
- }
- collar[total] = n;
- total++;
- scanf("%llu",&n);
- }
- reparar(collar, total);
- free(collar);
- scanf("%llu",&n);
- }
- return 0;
- }
- void reparar(unsigned long long *collar, unsigned long long total)
- {
- perla *perlas = NULL; //perlas segun su tamaño
- unsigned long long perlas_ordenadas = 1; //total de tamaños distintos entre las perlas
- unsigned long long i, j, k;
- qsort(collar, total, sizeof(unsigned long long), compara); //orden ascendente
- long long mayor = collar[total-1]; //perla mas grande
- /* se cuenta el total de tamaños diferentes en el collar */
- for(i=0 ; i<total-1 ; i++) {
- if(collar[i] != collar[i+1]) perlas_ordenadas++;
- }
- /* se organizan las perlas segun su tamaño */
- perlas = (perla *)calloc(perlas_ordenadas, sizeof(perla));
- if(perlas == NULL) {
- printf("Operacion fallida\n");
- EXIT_FAILURE;
- }
- for(i=0 ,j=0 ; i<total ; i++) {
- perlas[j].cantidad++;
- if(collar[i] != collar[i+1]) {
- perlas[j].tamano = collar[i];
- j++;
- }
- }
- /* se comprueba si es posible lograr la simetria en el collar de perlas
- se considera asimetrico cuando la cantidad de perlas mas grandes es un numero par */
- if(perlas[perlas_ordenadas-1].cantidad%2 == 0) {
- printf("NO\n");
- return;
- }
- for(i=0 ; i<perlas_ordenadas ; i++) {
- if((perlas[i].cantidad%2)&&(i<perlas_ordenadas-1)) {
- printf("NO\n");
- return;
- }
- }
- /* se organizan las perlas de forma simetrica, desde afuera hacia adentro */
- for(i=0,j=total-1,k=0 ; i<j ; i++,j--) {
- if(perlas[k].cantidad) {
- collar[i]=perlas[k].tamano;
- collar[j]=perlas[k].tamano;
- perlas[k].cantidad-=2;
- }
- else {
- k++;
- j++;
- i--;
- }
- }
- collar[i]=mayor;
- /* se muestra el collar ordenado simetricamente */
- for(i=0 ; i<total ; i++) printf("%llu ",collar[i]);
- printf("\n");
- }
- int compara(const void *a, const void *b)
- {
- const int *p = a;
- const int *q = b;
- return((*p) > (*q));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement