Cod sursa(job #463725)

Utilizator simona.poilincaSimona Poilinca simona.poilinca Data 17 iunie 2010 12:35:12
Problema Gutui Scor 100
Compilator c Status done
Runda teme_upb Marime 1.48 kb
#include <stdlib.h>
#include <stdio.h>


typedef struct gutuie {

	long inaltime;
	long greutate;
	long level;
} Gutui;


int comp(const void *a, const void *b)
{

	Gutui *ia = (Gutui *)a;
	Gutui *ib = (Gutui *)b;
	return (ia->greutate < ib->greutate);

} 


int main()
{
	
	long H,U,MASA=0;
	long i,N,l,k=0,max_level=0,j;
	FILE *f;
	f=fopen("gutui.in","r");

	fscanf(f,"%ld",&N);
	fscanf(f,"%ld",&H);
	fscanf(f,"%ld",&U);
		
	Gutui *G;
	G=(Gutui*)malloc(N*sizeof(Gutui));
	
	for (i=0;i<N;i++)
	{
		fscanf(f,"%ld",&G[i].inaltime);	
		fscanf(f,"%ld",&G[i].greutate);
	}
	
	
	for (i=0;i<N;i++)
	{
		G[i].level = (H-G[i].inaltime)/U+1;
		if (G[i].level > max_level)
			max_level = G[i].level;	
	}
	
	int *V;
	V=(int*)calloc(max_level,sizeof(int));

	qsort(G,N,sizeof(Gutui),comp);


	//CALCUL MASA DE FRUCT ACUMULUATA
	for (i=0;i<N;i++)
	{
		/*for (l=0;l<max_level;l++)
			printf("%d  ",V[l]);
		printf("\n"); */



		if (V[G[i].level-1] == 0)
		{
			V[G[i].level-1]=1;
			MASA+=G[i].greutate;
			k++;
			//printf("adaugat %ld\n",G[i].greutate);
		}
		
		else if (V[G[i].level-1] == 1)
		{
			j=G[i].level-1;
			while (V[j] == 1)
			{
				if (j==0)
					break;
				j--;
			}
			if (V[j] == 0)
			{
				V[j]=1;
				MASA+=G[i].greutate;
				k++;
				//printf("adaugat %ld\n",G[i].greutate);
			}
	
		}	

			
	}
	
	//for (i=0;i<N;i++)
		//printf("Gutuia \t%ld:\t%ld\t%ld\t%ld\t\n",i,G[i].inaltime,G[i].greutate,G[i].level);


	FILE *f2;
	f2=fopen("gutui.out","w");
	fprintf(f2,"%ld\n",MASA);
	fclose(f2);
	
	return 0;
}