Cod sursa(job #438628)

Utilizator martzyAndrei Maruseac martzy Data 10 aprilie 2010 22:06:47
Problema Gutui Scor 10
Compilator c Status done
Runda teme_upb Marime 1.68 kb
/**
 * Maruseac Andrei
 * 325 CC
 * Proiectarea Algoritmilor
 * Tema 1
 * Problema 2: gutui
 */

#include <stdio.h>
#include <stdlib.h>

int N;	/* numarul de gutui din copac */
int H;	/* inaltimea maxima la care se poate ajunge */
int U;	/* cu cat se ridica crengile dupa culegerea unui gutui */

typedef struct gutui {
	int h;	/* inaltimea la care se afla gutuiul */
	int g;	/* greutatea gutuiului */
} gutui;

gutui gut[100001];

/**
 * functie de comparare a 2 gutui
 * a, b		elementele de comparat
 */
int comp (const void * a, const void * b)
{
	gutui * a1 = (gutui *) a;
	gutui * b1 = (gutui *) b;
	
	return b1 -> g - a1 -> g;
}

/**
 * functie de citire
 * file_name	nume fisier
 */
void read (char * file_name) 
{
	int i;

	FILE * fd = fopen (file_name, "r");
 
	// dimensiune matrice 
	fscanf (fd, "%d", &N);
	fscanf (fd, "%d", &H);
	fscanf (fd, "%d", &U);

	// citire inaltime si greutate gutui
	for (i = 0; i < N; i ++) {
		fscanf (fd, "%d", &gut[i].h);
		gut[i].h = ((gut[i].h - 1) / U + 1) * U;
		fscanf (fd, "%d", &gut[i].g);
	}

	fclose (fd);
}

int calcmax (int dim)
{
	int * mom = calloc (dim, sizeof (int));
	int i, j, s = 0;
		
	for (i = 0; i < dim; i ++)
		if(mom[(H - gut[i].h) / U] == 0)
			mom[(H - gut[i].h) / U] = gut[i].g;
		else
			for (j = (H - gut[i].h) / U; j >= 0; j --)
				if(mom[j] == 0) {
					mom[j] = gut[i].g;
					break;//j = -1;
				}
								
	for (i = 0; i < dim; i ++)
		s = s + mom[i];
		
	for (i = 0; i < dim; i ++)
		printf ("%d ", mom[i]);
		
	return s;
}

void resolv ()
{
	FILE *fd = fopen ("gutui.out", "w");
	
	qsort (gut, N, sizeof (gutui), comp);
	
	fprintf (fd, "%d", calcmax (H / U + 1));
	fclose (fd);
}

int main ()
{
	read ("gutui.in");
	resolv ();	
	return 0;
}