Cod sursa(job #440701)

Utilizator DarkHunterjCont cu nume gresit sau fals DarkHunterj Data 12 aprilie 2010 13:15:14
Problema Gutui Scor 30
Compilator c Status done
Runda teme_upb Marime 1.69 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct gutui
{
	int size;
	int weight;
}Gutue;

int rule(const void * a, const void *b)
{
	Gutue * A =(Gutue *)a;
	Gutue * B =(Gutue *)b;
	if(A->weight > B->weight)
		return -1;
	else if(A->weight < B->weight)
		return 1;
	else
		return A->size-B->size;
}

void printr(int n, int *vect)
{
	int i;
	for(i=0; i<n;i++)
	{
		printf("%i ",vect[i]);
	}
	printf("\n");
}

int insert(int weight,int size,int *vect)
{
	if(vect[size]==0)
	{
		vect[size]=weight;
		return weight;
	}
	else
	{
		while(size>0)
		{
			if(vect[size]==0)
			{
				vect[size]=weight;
				return weight;
			}
			size--;
		}
		return 0;
	}
}

int main(int argc, char **argv)
{
	int H, aux, min, dif, U, n, i, total=0;
	int *vect;
	FILE * in = fopen("gutui.in","rt");
	FILE * out = fopen("gutui.out","wt");
	
	//Read data
	fscanf(in,"%i %i %i",&n,&H,&U);
	Gutue *gut = (Gutue *) malloc(sizeof(Gutue) * n);
	min=H;
	dif=(H+1)%U;
	for(i=0;i<n;i++)
	{
		fscanf(in,"%i %i",&(gut[i].size),&(gut[i].weight));
		if(gut[i].size>H)
		{
			i--;
			n--;
		}
		else
		{
			gut[i].size-=dif;
			gut[i].size/=U;
			if(gut[i].size<min)
				min=gut[i].size;
		}
	}
	H++;
	H/=U;
	
	//Read data
	
	qsort(gut,n,sizeof(Gutue),rule);
	
	vect=(int*) malloc(sizeof(int)*(H-min+1));
	
	for(i=0; i<(H-min+1);i++)
	{
		vect[i]=0;
		//printf("%i ",vect[i]);
	}
	//printf("\n");
	for(i=0; i<n; i++)
	{
		//printf("%i ",min);
		aux=insert(gut[i].weight,H-gut[i].size,vect);
		printr(H-min+1,vect);
		//printf("%i \n",aux);
		total+=aux;
	}
	
	printr(H-min+1,vect);
	
	printf("\n");
	for(i=0;i<n;i++)
	{
		printf("%i %i\n",gut[i].size,gut[i].weight);
	}
	
	fprintf(out,"%i\n",total);
	
	
	scanf("%i",&i);
		
	fclose(in);
	fclose(out);
	return 0;
}