Cod sursa(job #440084)

Utilizator DarkHunterjCont cu nume gresit sau fals DarkHunterj Data 11 aprilie 2010 21:49:02
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 1.26 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->size > B->size)
		return -1;
	else if(A->size < B->size)
		return 1;
	else
		return B->weight-A->weight;
}

int main(int argc, char **argv)
{
	int maxsize, dif, aux, step, n, i, total=0;
	int rest=0;
	FILE * in = fopen("gutui.in","rt");
	FILE * out = fopen("gutui.out","wt");
	//Read data
	fscanf(in,"%i %i %i",&n,&maxsize,&step);
	Gutue *gut = (Gutue *) malloc(sizeof(Gutue) * n);
	dif=maxsize%step;
	maxsize/=step;
	for(i=0;i<n;i++)
	{
		fscanf(in,"%i %i",&(gut[i].size),&(gut[i].weight));
		gut[i].size-=dif;
		gut[i].size/=step;
	}
	//Read data
	
	qsort(gut,n,sizeof(Gutue),rule);
	
	for(i=0;i<n;i++)
	{
		printf("%i %i\n",gut[i].size,gut[i].weight);
	}
	
	for(i=0;i<n;i++)
	{//eliminates "gutuis" that can't be reached
		if(gut[i].size<=maxsize)
			break;
	}
	for(;i<n;i++)
	{
		rest+=maxsize-gut[i].size;
		aux=gut[i].size;
		while(gut[i].size==aux && rest>0 && i<n)
		{
			total+=gut[i].weight;
			i++;
			rest--;
		}
		if(rest==0)
			while(gut[i].size==aux && i<n)
				i++;
		i--;
		maxsize=aux;
	}
	fprintf(out,"%i\n",total);
	scanf("%i",&i);
	fclose(in);
	fclose(out);
	return 0;
}