Cod sursa(job #439009)

Utilizator bogdanl_yexbogdan bogdanl_yex Data 11 aprilie 2010 11:33:11
Problema Gutui Scor 40
Compilator c Status done
Runda teme_upb Marime 2.29 kb
#include <stdio.h>
#include <stdlib.h>


typedef struct heap{
int a[100];
int index;
}heap;

typedef struct GUT{
        int h;//inaltime la care se afla gutuia
        int g;  // greutatea gutuii      
}GUT;

int compare (const void * a, const void * b){//functie de comparare pe care o utilizez la sortarea dupa inaltime
  return ( *(int*)b - *(int*)a );
}

void insertpq(heap *p,int val){
  int i;
if(p->index==99)
  printf("\nHeap is full");
 else{
   for(i=++p->index;i>0 && p->a[(i-1)/2]>val;i=(i-1)/2)
      p->a[i]=p->a[(i-1)/2];
   p->a[i]=val;
   }
}

int removeq(heap *p){
  int value,temp,i;
  if(p->index==-1){
   return -1;
   }
   else{
 value=p->a[0];
 temp=p->a[p->index--];
 for(i=1;i<=p->index;i=2*i+1){
    if(((i+1)<=p->index) && (p->a[i]>p->a[i+1]))
     i++;
     if(p->a[i])
        p->a[(i-1)/2]=p->a[i];
     else
        break;
 }
    p->a[(i-1)/2]=temp;
    return value;
   }
 }



int main(){
 FILE* fisierin=fopen("gutui.in","r");
 FILE* fisierout=fopen("gutui.out","w");
 int n,h,u,i;
 GUT* vec;
 int min_partial=0;
 heap s;
 s.index=-1; 
  
 fscanf(fisierin,"%d ",&n); 
 fscanf(fisierin,"%d ",&h); 
 fscanf(fisierin,"%d ",&u); 
 
 
 vec=(GUT*)malloc(n*sizeof(GUT));//vector de gutui

 
 for(i=0;i<n;i++){
  fscanf(fisierin,"%d",&vec[i].h);
  fscanf(fisierin,"%d",&vec[i].g);
  
}

qsort (vec, n, sizeof(GUT), compare);//sortez descrescator  dupa inaltime






insertpq(&s,vec[0].g);//adaug gutuia de la cea mai mare inaltime in heap
h=h-u;//se ridica celelalte gutui cu u unitati
for(i=1;i<n;i++){  //parcurg restul de gutui             
     if(vec[i].h<=h){          //verific daca mai pot culege 
       insertpq(&s,vec[i].g);
       h=h-u;
}

     else{// daca in aux am o gutuie mai usoara  o inlocuiesc daca nu trec la urmatoarea
          min_partial=removeq(&s);
          if(vec[i].g >min_partial){
           insertpq(&s,vec[i].g);
           }
           else insertpq(&s,min_partial);
          
          }
          }
int cant_max=0;//cantiatea maxima de gutui pe care o pot culege
while(s.index!=-1){
 cant_max=cant_max+removeq(&s);//calculez cantitatea maxima de gutui
}
fprintf(fisierout,"%d \n",cant_max);
          


 fclose(fisierin);
 fclose(fisierout);
 return 0; 
   
}