Cod sursa(job #437567)

Utilizator VladTVlad Tudose VladT Data 9 aprilie 2010 22:04:54
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 1.78 kb
#include<stdio.h>
#include<stdlib.h>

typedef struct{
	unsigned long height, weight;			
	unsigned 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;
	//	printf("h: %d  w:  %d\n", gutui[i].height, gutui[i].weight);
	}
//	printf("\n");
	fclose(in);
	
	qsort (gutui, N, sizeof(Gutuie), compareH);

    while(1)
    {
		while( gutui[i].level==0 && i<N )
			i++;
		if(i==N)
            break;
		current=gutui[i].level;
		index=i;
		max=gutui[i].weight;
		while((gutui[i].level==current || gutui[i].level==0) && i<N)
		{
			if(gutui[i].level==0)
				i++;
			else
			{
				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);
	//*******************************************************************************
	
//	getch();
	free(gutui);
	return 0;
}