Pagini recente » Cod sursa (job #2915071) | Cod sursa (job #1438985) | Cod sursa (job #690728) | Cod sursa (job #2556184) | Cod sursa (job #437590)
Cod sursa(job #437590)
#include<stdio.h>
#include<stdlib.h>
typedef struct{
long height, weight;
long level;
} Gutuie;
int compareH (const void * a, const void * b)
{
Gutuie *g1=(Gutuie *)a;
Gutuie *g2=(Gutuie *)b;
if(((g1->height) - (g2->height))<0)
return -1;
return 1;
}
int compareV (const void * a, const void * b)
{
Gutuie *g1=(Gutuie *)a;
Gutuie *g2=(Gutuie *)b;
if(((g1->weight) - (g2->weight))<0)
return -1;
return 1;
}
int main()
{
int N=0, H=0, U=0, i, max, sum=0, start, current, j, k, index;
Gutuie *gutui, *copy;
FILE * in = fopen("gutui.in", "r");
if(in==NULL)
return 1;
fscanf(in, "%d", &N);
fscanf(in, "%d", &H);
fscanf(in, "%d", &U);
// printf("%d %d %d\n",N, H, U);
gutui=(Gutuie*)malloc(N*sizeof(Gutuie));
copy=(Gutuie*)malloc(N*sizeof(Gutuie));
for(i=0; i<N; i++)
{
fscanf(in, "%ld", &gutui[i].height);
fscanf(in, "%ld", &gutui[i].weight);
gutui[i].level=(H-gutui[i].height)/U + 1;
}
fclose(in);
qsort (gutui, N, sizeof(Gutuie), compareH);
j=0;
while(1)
{
while( gutui[j].level==0 && j<N )
j++;
if(j==N)
break;
current=gutui[j].level;
index=j;
max=gutui[j].weight;
gutui[j].level--;
i=j++;
while((gutui[i].level==current || gutui[i].level==0) && i<N)
{
if(gutui[i].level==0)
i++;
else
{
gutui[i].level--;
if(gutui[i].weight>max)
{
max=gutui[i].weight;
index=i;
}
i++;
}
}
gutui[index].level=0;
sum+=max;
}
FILE * out = fopen("gutui.out", "w");
fprintf(out, "%d", sum);
fclose(out);
free(gutui);
return 0;
}