Cod sursa(job #441355)

Utilizator cristina.chiriacChiriac Cristina cristina.chiriac Data 12 aprilie 2010 21:30:44
Problema Gutui Scor 80
Compilator c Status done
Runda teme_upb Marime 2.01 kb
#include<stdio.h>
#include<stdlib.h>

/*      ---          Chiriac Cristina 321CB      ---      */
/*      ---           Tema 1,   Problema 2       ---      */

typedef struct gutui
{
	int	inaltime,greutate;		
}Gutui;

/*int sortareInaltime(const void *a, const void *b)
{
	Gutui *A =(Gutui*) a;
	Gutui *B =(Gutui*) b;
	
	if( A->inaltime > B->inaltime )
		return -1;
	else if( A->inaltime < B->inaltime )
		return 1;
	else
		return A->greutate - B->greutate; 
}*/

int sortareGreutate(const void *a, const void *b)
{
	Gutui *A =(Gutui*) a;
	Gutui *B =(Gutui*) b;
	
	return B->greutate -  A->greutate ;
}

int main()
{
	int nrgutui,H,U,nivelMax,i,j,inalt,greut,suma = 0,max = 0;
	FILE *f,*g;	
	f = fopen("gutui.in","rt");
	g = fopen("gutui.out","wt");
	fscanf(f,"%i%i%i",&nrgutui,&H,&U);
	Gutui *vectgutui;
	vectgutui = (Gutui*) malloc(sizeof(Gutui) * nrgutui);
	nivelMax = H/U;
	int * vect = (int*) malloc(sizeof(int)*(nivelMax+1));
	for( i = 0 ; i < nivelMax ; i++ )
		vect[i] = 0;
					
	for( i = 0 ; i < nrgutui ; i++ )
	{
		fscanf(f,"%i%i",&inalt,&greut);
		vectgutui[i].inaltime = inalt;
		vectgutui[i].greutate = greut;
		if( inalt > H )
		{
			i--;
			nrgutui--;	
		}
		else
		{
			if( (vectgutui[i].inaltime%U) > (H%U) )
				vectgutui[i].inaltime = nivelMax - vectgutui[i].inaltime/U ;
			else 
				vectgutui[i].inaltime = nivelMax - vectgutui[i].inaltime/U + 1;
		}
	}
	
	qsort(vectgutui,nrgutui,sizeof(Gutui),sortareGreutate);
	
	
	for( i = 0 ; i < nrgutui ; i++ )
	{
		printf("%i %i\n",vectgutui[i].inaltime,vectgutui[i].greutate);
	}
	
	int total=0;
	for( i = 0 ; i < nrgutui ; i++ )
	{
		if( vect[ vectgutui[i].inaltime ] != 0 )
		{
			for( j = vectgutui[i].inaltime - 1; j > 0 ; j--)
			{
				if( vect[j] == 0 )
				{
					total+=vectgutui[i].greutate;
					vect[j] = 1;
					break;
				}
			}	
		}
		else
		{
			vect[ vectgutui[i].inaltime ]=1;
			total+=vectgutui[i].greutate;
		}
	}
	
	fprintf(g,"%i ", total);


	fclose(f);
	fclose(g);
}