Pagini recente » Cod sursa (job #1225977) | Cod sursa (job #1786344) | Cod sursa (job #439082)
Cod sursa(job #439082)
#include <stdio.h>
#include <stdlib.h>
typedef struct heap{
int *a;
int size;
}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 alocare(heap *p, int n){
p->a=(int*)malloc(n*sizeof(int));
p->size=-1;
}
void insertpq(heap *p,int val){
int i;
for(i=++p->size;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;
value=p->a[0];
temp=p->a[p->size--];
for(i=1;i<=p->size;i=2*i+1){
if(((i+1)<=p->size) && (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,aux;
GUT* vec;
int min_partial;
heap s;
alocare(&s,n);
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.size!=-1){
aux=removeq(&s);
printf("%d ",aux);
cant_max=cant_max+aux;//calculez cantitatea maxima de gutui
}
fprintf(fisierout,"%d \n",cant_max);
fclose(fisierin);
fclose(fisierout);
getchar();
return 0;
}