Cod sursa(job #438752)

Utilizator catamihaCatalina Nita catamiha Data 10 aprilie 2010 23:52:30
Problema Gutui Scor 30
Compilator c Status done
Runda teme_upb Marime 3.39 kb

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

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

int compara(void* a,void* b)
{
    unsigned int val_a,val_b,vala,valb;
    val_a=(*((gutuie *)a)).h;
    val_b=(*((gutuie *)b)).h;
    vala=(*((gutuie *)a)).g;
    valb=(*((gutuie *)b)).g;
    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);
     unsigned int *ridicari,*nivele;
    gutuie *date;
    date=(gutuie*) calloc(N,sizeof(gutuie));

    int i,k,m=0,j=0;
    unsigned int nr_max_gutui;
    ridicari = (unsigned int *) calloc(N,sizeof (unsigned int));
     nivele = (unsigned int *) calloc(N+1,sizeof (unsigned int));


    //citim datele despre fiecare creanga
    for(i=0;i<N;i++)
        fscanf(in,"%u%u",&date[i].h,&date[i].g);

    qsort(date,N,sizeof(gutuie),(__compar_fn_t)&compara);
   for(i=1;i<=N;i++)
        nivele[i]=0;
    for(i=0;i<N;i++)
       printf("%u %u\n",date[i].h,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
    
    printf ("%d \n", nr_max_gutui);
    int culese=0;
    unsigned int suma=0;
    for (i=0;i<N;i++)
     { if (date[i].h<=H)       
       ridicari[i]=(H-date[i].h)/U +1;      

      if (date[i].h>H)
       ridicari[i]=0;}
 
    for (i=0;i<N;i++)
       printf("%d ", ridicari[i]);
   printf("\n");
   /*if (nr_max_gutui==N)
    	for (i=0;i<N;i++)
		suma=suma+date[i].g;
   else*/
    for(i=0;i<N;i++) 
     {  
        m=(H-date[i].h)/U+1;
       if (m>0)
         if (culese<nr_max_gutui)

            if(nivele[m]<m+1)   //poate fi culeasa in conditiile date
            {  
                suma+=date[i].g;
                culese++;
                nivele[m]++;
                
            }}
/*for(i=0;i<N;i++) 
     {  
        m=ridicari[i]-1;

         if (culese<nr_max_gutui)

            if(nivele[m]!=ridicari[i]&&ridicari[i]>0)   //poate fi culeasa in conditiile date
            {  
                suma+=date[i].g;
                culese++;
                nivele[ridicari[i]-1]++;
                
            }}
  /* if ((H-minim)%U==0) 
       for(i=j+1;i<N;i++)
    
	{ 	if (date[i].h==minim)
			{suma+=date[i].g; break;}
		
	}
   else
        for(i=j+1;i<N;i++)
		{m=ridicari[i]-1;
           
    		 if(nivele[m]!=ridicari[i]&&ridicari[i]>0)
				{suma+=date[i].g; break;}}*/
  
 /*if ((H-minim)%U==0)
		if (date[j].h!=minim && nr_max_gutui>1)
			{suma=suma-date[j].g;
			 for(i=j+1;i<N;i++)
    
				if (date[i].h==minim)
					{suma+=date[i].g; break;}*/
		
			//}
        
printf("\n");
         for (i=1;i<=N;i++)
       printf("%d ", nivele[i]);
        fprintf(out,"%u\n",suma);

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