Cod sursa(job #435409)

Utilizator violeta.marinVioleta Marin violeta.marin Data 7 aprilie 2010 14:02:58
Problema Gutui Scor 10
Compilator c Status done
Runda teme_upb Marime 4.11 kb
#include <stdio.h>
#include <stdlib.h>

unsigned int h,u,n;

struct gut{
	unsigned int inalt;	
	unsigned int greu;
	};

int compare (const void * a, const void * b)
{
	unsigned int cat1, cat2;
	cat1 = ((*(struct gut*)a).inalt/u);
	cat2 = ((*(struct gut*)b).inalt/u);
	
	if (cat1 == cat2)
		return -((*(struct gut*)a).greu - (*(struct gut*)b).greu); 
	
	return -(cat1 - cat2);
	 	
}



int main(){
	unsigned int i, j, k;
	FILE *f = fopen("gutui.in","r");
	fscanf(f, "%u", &n);
	fscanf(f, "%u", &h);
	fscanf(f, "%u", &u);
	
	//printf("n = %u h = %u u = %u\n", n ,h,u);
	//printf("%u\n", h/u);
	struct gut *gutui = (struct gut *)malloc(n * sizeof(struct gut));
	
	for (i = 0; i < n; i++)
		{
		fscanf(f, "%u", &gutui[i].inalt);
		fscanf(f, "%u", &gutui[i].greu);
		}
	fclose(f);

	qsort(gutui, n, sizeof(struct gut), compare);
	/*for (i = 0; i < n; i++)
		{
		printf("%u ", gutui[i].greu);
		printf("%u \n", gutui[i].inalt);
		}
	printf("\n");*/

	unsigned int nr_niv = (h - gutui[n - 1].inalt)/u + 1;
	unsigned int *niv = (unsigned int *)calloc(nr_niv ,sizeof(unsigned int));
	unsigned int *nrgutpeniv = (unsigned int *) calloc(nr_niv, sizeof(unsigned int));
	unsigned int *indpeniv = (unsigned int *) calloc(nr_niv, sizeof(unsigned int));
	
	//printf("nr_niv = %u\n", nr_niv);	
	j = 0; 
	for ( i = 0; i < nr_niv; i++)
		{ 
		k = 0;
		if (j < n){
		if (((h - gutui[j].inalt)/u ) == i) 
			{
			indpeniv[i] = j + 1;
			niv[i] = i + 1;
			k = k + 1;
			j = j + 1;
			}
		}
		if (j < n)
		
		while (((h - gutui[j].inalt)/u ) == i) 
			{
			k = k + 1;
			j = j + 1;
			}
		nrgutpeniv[i] = k; 
		
		}
		

	/*printf("indici pe niv: \n");
	for ( i = 0; i < nr_niv; i++)
		printf("%u ", indpeniv[i]);
	printf("\n");

	printf("gutui pe niv: \n");
	for ( i = 0; i < nr_niv; i++)
		printf("%u ", nrgutpeniv[i]);
	printf("\n");
 
	printf("niv: \n");
	for ( i = 0; i < nr_niv; i++)
		printf("%u ", niv[i]);
	printf("\n");*/
 
	i = 0;
	unsigned int index = 0, max = 0, fin = 0, niv_vir = 0, kk;

for (i = 0; i < nr_niv; i++){ 
	//printf("i = %u\n", i);
	max = 0;
	niv_vir = 0;
	for (j = 0; j < nr_niv; j++){
		if (indpeniv[j] != 0){
			//printf("j = %u\n", j);
			//if (niv[j] <= (nrgutpeniv[j]))
			if (niv[j] != 0){
			
				//if ((gutui[indpeniv[j] - 1].inalt + i * u )<= h)
				if ((niv_vir + 1) <= nrgutpeniv[j])
					{
					//printf("nrgutpeniv = %u \n", nrgutpeniv[j]);
					//printf("!!!!!!!!%u\n",indpeniv[j] - 1 + niv[j] - 1);
					//if (max < (gutui[indpeniv[j] - 1 + niv[j] - 1].greu))
					if (max < (gutui[indpeniv[j] - 1 + niv_vir].greu)) 
					{
					//kk = gutui[indpeniv[j] - 1 + niv_vir].greu;
					//printf("kk = %u ",kk);
					//if (max < kk) printf("!!!!!\n");
					//printf("max = %u\n", max);
					//printf("j = %u niv_vir = %u ", j, niv_vir);
					//printf("!\n");
					//max = gutui[indpeniv[j] - 1 + niv[j] - 1].greu;
					max = gutui[indpeniv[j] -1 + niv_vir].greu;
					//printf("max = %u\n", max);
					index = j;
					}
					}
					niv_vir++;
					}
		//break;
					}
					}
	//printf("max = %u\n", max);
	if (max == 0) {
		for (j = 0; j < nr_niv; j++)
			if (indpeniv[j] != 0){
			//printf("j = %u\n", j);
				if ((niv[j] != 0)&&(nrgutpeniv[j] != 0)){
					//printf("!!!!!!!!%u\n",indpeniv[j] - 1 + niv[j] - 1);
					if (max < (gutui[indpeniv[j] - 1].greu))
					{
					//printf("!\n");
					max = gutui[indpeniv[j] - 1].greu;
					index = j;
					}
					}
				}}
			else
			
			max = gutui[indpeniv[index] - 1].greu;	
			//printf("index = %u\n", index);
			//printf("max = %u\n", max);
			if (nrgutpeniv[index] != 0) nrgutpeniv[index] = nrgutpeniv[index] - 1;
			if (nrgutpeniv[index] != 0) indpeniv[index] = indpeniv[index] + 1;
			fin = fin + max; 
			
		
	/*printf("indici pe niv: \n");
	for ( j = 0; j < nr_niv; j++)
		printf("%u ", indpeniv[j]);
	printf("\n");

	printf("gutui pe niv: \n");
	for ( j = 0; j < nr_niv; j++)
		printf("%u ", nrgutpeniv[j]);
	printf("\n");*/
	for (j = 0; j < nr_niv; j++)
		if (niv[j] != 0) niv[j] = niv[j] - 1;
	/*printf("niv: \n");
	for ( j = 0; j < nr_niv;j++)
		printf("%u ", niv[j]);
	printf("\n");*/
 
	}
	f = fopen("gutui.out", "w");
	fprintf(f, "%u\n", fin);	
	//printf("fin = %u\n", fin);				
	fclose(f);			   	
 
return 0;
}