Cod sursa(job #443010)

Utilizator VeneficusNitoiu Cristian Nicolae Veneficus Data 15 aprilie 2010 21:16:11
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 2.52 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;
    for (i=0;i<n && niv<lvlmax ;i++)
        if(niv == a[i].lvl )
        { lista[niv][j]= (int ) malloc(1*sizeof(int)); lista[niv][j]=a[i].g; j++;}
        else
        {
            lista[niv][j]= (int ) malloc(1*sizeof(int));
            lista[niv][j]=-1;
            j=0;
            i--;
            niv++; 
        } 
   /* 
    for (i=0,k=0; i<lvlmax;)
    {
        if(lista[i][k] >= 0)
            printf("%i ",lista[i][k++]);
        else { i++; k=0; printf("\n");}    
    } */
    
    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;
}