Cod sursa(job #442964)

Utilizator VeneficusNitoiu Cristian Nicolae Veneficus Data 15 aprilie 2010 19:35:31
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 2.45 kb
#include <stdio.h>
#include <stdlib.h>
//#include <conio.h>

int n,h,u;
typedef struct
{
    int lvl;
    int g;
} gutuie;
gutuie *a;

int condsort (const void * x, const void * y)
{
    gutuie *a= (gutuie *) x;
    gutuie *b= (gutuie *) y;
    if (a->lvl < b->lvl) return -1;
    else if(a->lvl > b->lvl) return 1;
        else if( a->g > b->g) return -1;
            else return 1;                
}

int main()
{
    FILE *f;
    int i,ha,niv,j, lvlmax=0,s=0,counter, elem, k,valid,rem=0, o=0;
    int  **lista ; //vector de pointeri
    f= fopen("gutui.in", "r");
    fscanf (f, "%i %i %i",&n,&h,&u);
    a = (gutuie*)malloc(n*sizeof(gutuie));
    for(i=0;i<n;i++)
    {
        fscanf (f, "%i %i",&ha,&a[i].g);
        a[i].lvl= (h - ha)/ u ;
        if ( ha > h ) { i--;   n--; }
        if ( a[i].lvl >= lvlmax ) lvlmax=a[i].lvl+1;
    }
    fclose(f);
    qsort (a, n, sizeof(gutuie), condsort);
    lista= (int **)malloc(lvlmax*sizeof(int *));

    niv=0; j=0;
    lista[0]=(int *) malloc(1*sizeof(int));
    for (i=0;i<n;i++)
        if(niv == a[i].lvl )
        { lista[niv][j]= (int ) malloc(1*sizeof(int)); lista[niv][j++]=a[i].g;}
        else{
            lista[niv][j]= (int ) malloc(1*sizeof(int));
            lista[niv][j]=-1;
            niv++; j=0;
            lista[niv]=malloc (1*sizeof(int));
            lista[niv][j++]=a[i].g;
        }
    lista[niv][j]= (int ) malloc(1*sizeof(int));
    lista[niv][j]=-1; 
    
    f=fopen("gutui.out", "w");
      
    j=lvlmax;
    niv=0;
    elem=lista[niv][0];
    while(j!=1)
    {
           

        counter=0;
        valid=1;
        for(k=0,i=niv+1;i<lvlmax;)
        {
            if(elem < lista[i][k++] )
            {   
                counter++;
                if(counter > i-niv+rem) { o=0; niv++; rem++; valid=0; elem=lista[niv][0]; break; }
            }
            else { i++; k=0; }
        }
        if (valid)
        {   
            s+=elem; j--; fprintf(f,"%i ",elem);
            if(rem) { rem--; elem=lista[niv][++o]; }
            else { niv++; o=0; elem=lista[niv][0]; }
        }
        
    }
    fprintf(f,"%i\n\n",elem);
    s+=elem;
    for (i=0,k=0; i<lvlmax;)
    {
        if(lista[i][k] >= 0)
            fprintf(f,"%i ",lista[i][k++]);
        else { i++; k=0; fprintf(f,"\n");}
        
    }
    fprintf(f,"%i",s);
    fclose(f);
    free(a);
    free(lista); 
    
   // getch();
    return 0;
}