Cod sursa(job #438962)

Utilizator catamihaCatalina Nita catamiha Data 11 aprilie 2010 08:07:17
Problema Gutui Scor 10
Compilator c Status done
Runda teme_upb Marime 2.58 kb

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

typedef struct{
    unsigned int h; //inaltimea crengii pe care se afla gutuia
    unsigned int g; //greutatea gutuii
    unsigned int level;
} gutuie;

typedef struct{
    unsigned int poz; //inaltimea crengii pe care se afla gutuia
    unsigned int val; //greutatea gutuii
   
} valminime;

int compara(void* a,void* b)
{
    unsigned int val_a,val_b,vala,valb;
    val_a=(*((gutuie *)a)).g;
    val_b=(*((gutuie *)b)).g;
    vala=(*((gutuie *)a)).level;
    valb=(*((gutuie *)b)).level;
    if(vala>valb)
        return 1;
    else
        if(vala<valb)
            return -1;
        else
        {
            if(val_a<val_b)
                return 1;
            else
                if(val_a>val_b)
                    return -1;
                else
                    return 0;
        }
}

int main()
{
    //deschidere fisier de intrare, respectiv fisier de iesire
    FILE *in,*out;
    in=fopen("gutui.in","r");
    out=fopen("gutui.out","w");

    //citim numarul de gutui, inaltimea maxima si cu cat se ridica crengile
    int N,H,U;
    fscanf(in,"%d%d%d",&N,&H,&U);
     
    gutuie *date,*sol;
    valminime *vmin;
    date=(gutuie*) calloc(N,sizeof(gutuie));
    sol=(gutuie*) calloc(N,sizeof(gutuie));
    vmin=(valminime*) calloc(N,sizeof(valminime));
    
    int i;
    unsigned int nr_max_gutui;

     


    for(i=0;i<N;i++)
        fscanf(in,"%u%u",&date[i].h,&date[i].g);

    for (i=0;i<N;i++)
		date[i].level=(H-date[i].h)/U+1;
    
    qsort(date,N,sizeof(gutuie),(__compar_fn_t)&compara);
   
  for(i=0;i<N;i++)
      printf("%u %u\n",date[i].level,date[i].g);
    unsigned int minim=date[0].h;

    for(i=1;i<N;i++)

        if(date[i].h<minim)
            minim=date[i].h;

    //printf("%u\n",minim);
    
    nr_max_gutui=(H-minim)/U + 1;  //cate gutui ar putea fi maxim culese a.i. sa se respecte conditiile
   
    

	
 
         
  
    int culese=0;
    long int suma=0;
    int j=0,min=0,k;
    min=date[0].g;
   //printf ("%d ",min);
    
	for (i=0;i<N;i++)

		{ if (culese<nr_max_gutui && date[i].level>=culese)

			{sol[culese]=date[i]; culese++; //printf ("%u ",sol[i].g);

				if(min<sol[culese].g) {printf ("%d ",min);min=sol[culese].g; vmin[j].poz=i;vmin[j].val=min;j++;}}

                  if (culese>nr_max_gutui || date[i].level<culese)

			{if (date[i].g>min) {sol[vmin[j].poz]=date[i];min=vmin[j-1].val;j--;}
				
			}}
			printf("\n");
    for (i=0;i<culese;i++)
		{suma=suma+sol[i].g; printf ("%ld ", suma);}

        fprintf(out,"%ld\n",suma);

    free(date);
    fclose(in);
    fclose(out);
    return 0;
}