Cod sursa(job #437215)

Utilizator dragosiordachedragos iordache dragosiordache Data 9 aprilie 2010 14:51:03
Problema Gutui Scor 80
Compilator c Status done
Runda teme_upb Marime 1.53 kb
#include "stdio.h"
int h,u;


typedef struct {
	int h,g;
	int val;
} gutui;

int cmp(void* a, void* b)
{
	int x = (((gutui*)b)->h)/u - (((gutui*)a)->h)/u;
	return (x?x:(((gutui*)b)->g - ((gutui*)a)->g));
}

int cmp2(void* a, void* b)
{
	int x = ((gutui*)b)->g - ((gutui*)a)->g;
	//return (x?x:((gutui*)b)->val - ((gutui*)a)->val);
	return x;
}

int main() 
{
	FILE *f, *g;
	f = fopen("gutui.in", "r");
	g = fopen("gutui.out", "w");
	int n,i;

	fscanf(f, "%i %i %i", &n,&h,&u);
	gutui a[n];
	gutui b[n];

	for (i=0;i<n;i++)
	{
		fscanf(f, "%i %i", &a[i].h, &a[i].g);
		a[i].val = 0;
	}

	qsort(a, n, sizeof(gutui), cmp);

	int j=0,   //numarul de gutui din grupul curent
		 k=1;   //numarul grupului curent

	int m=0;
	i=0; 
	while(i<n)
	{
		if (a[i].h > h-k*u)
		{
			if (j>=0)
			{
				b[m] = a[i];
				b[m].val = k-1;
				m++,j--;
			}
			i++;
		}
		else
		{
			j=k++;
		}
	}

	qsort(b, m, sizeof(gutui), cmp2);
	for (j=0;j<m;j++)
		printf("%i %i %i\n", b[j].h, b[j].g, b[j].val);
	printf("\n");
	
	int c[h/u+1];
	for (j=0;j<=h/u;j++)
		c[j]=0;
	int tot=0;
	int contor = 0;
	int boo = 0;
	for (j=0;j<m && contor<h/u+1;j++)
	{
		c[b[j].val]++;//vad daca gutuia curenta poate intra la solutie
		for (i=0,boo=1,k=-1;i<h/u+1 && boo;i++)
		{
			k+=c[i];
			if (k>i) boo = 0;//verific daca dupa ce o adaug la solutie poate fi culeasa
		}
		if (boo)
		{
			tot+=b[j].g;
			printf("%i %i %i\n", b[j].h, b[j].g, b[j].val);				
			contor++;
		}
		else
		{
			c[b[j].val]--;//daca nu
		}
	}
	fprintf(g, "%i", tot);

	printf("%i\n", tot);

	close(f);
	close(g);
	
	return 0;
}