Cod sursa(job #441625)

Utilizator berilacGutu Gabriel berilac Data 12 aprilie 2010 23:47:39
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 2.73 kb

	/*
	 * Gutu Marius Gabriel
	 * 321CA
	 * 
	 * Proiectarea Algoritmilor
	 * Tema 1
	 * Gutui
	 */
	
	#include <stdio.h>
	#include <stdlib.h>
	#include <math.h>
	
	#define INF	2000000000

	typedef struct
	{
		long int h;
		long int w;
	} gutuie;
	gutuie *gut;
	
	int compare (const void * a, const void * b)
	{
		/*if(((gutuie *)a)->h != ((gutuie *)b)->h)
	  return ((gutuie*)b)->w - ((gutuie*)a)->w;*/
	  return ((gutuie*)b)->h - ((gutuie*)a)->h;	  
	}
		
	int main()
	{
		/* Variabile principale */
		long int 
			N,	// numarul de gutui din copac
			H,	// inaltimea maxima la care ajunge Gigel
			U;	// cu cat se ridica crengile copacului dupa culegerea unei gutui
			
		long int
			gout;	// greutatea maxima a gutuilor pe care le poate culege Gigel
			
		long int 
			i, j, 	// contoare auxiliare
			//sortat,
			minh,
			aux;
		long int
			*nivel;
		
		// fisierele de intrare si de iesire
		FILE *fin, *fout;
		fin = fopen ("gutui2.in","r");
		fout = fopen ("gutui.out","w");
		
		// citim N, H si U
		fscanf(fin,"%ld %ld %ld",&N,&H,&U);
		
		// alocam spatiu pentru vectorul de greutati si pentru cel de 
		// inaltimi
		gut	=	(gutuie *) malloc (N*sizeof(gutuie));
		
		// citim perechile corespunzatoare inaltime-greutate pentru 
		// fiecare gutuie
		for (i=0; i<N; i++)
			fscanf(fin,"%ld %ld",&gut[i].h,&gut[i].w);
		
		// setam greutatea maxima pe care o poate obtine Gigel la 0
		gout	=	0;
				
		// sortare dupa greutati
		qsort(gut, N, sizeof(gutuie), compare);
		
		minh	=	INF;
		for (i=0; i<N; i++)
		{
			if (gut[i].h < minh)
				minh = gut[i].h;
			printf ("%ld\tw=%ld\th=%ld\t\n",i,gut[i].w,gut[i].h);
		}
		minh = (H-minh)/U+1;
		nivel	=	(long int *) calloc ((minh+5),sizeof(long int));

		printf ("minh=%ld\n",minh);
		
		for (i=1; i<=minh; i++) nivel[i] = -1;

		for (i=0; i<N; i++)
		{
			// calculez nivelul
			aux = (H - gut[i].h)/U + 1;
			if (aux>0)
			{
				printf ("Pun gutuia %ld pe nivelul %ld\n",i,aux);
				if (nivel[aux]==-1) { printf ("am pus-o\n"); nivel[aux] = i; }
				else
				{
					printf ("nu pot\n");
					for (j = aux-1; j>=0; j--)
						if (nivel[j]==-1)
						{
							printf ("am pus-o pe %ld\n",j);
							nivel[j] = i;
							break;
						}
				}
			}
		}
		
		printf ("%ld niveluri:\n",minh);
		for (i=1; i<=minh; i++)
		{
			if (nivel[i]!=-1)
				printf ("Nivelul %ld: %ld\n",i,gut[nivel[i]].w);
			else
				printf ("Nivelul %ld: %d\n",i,0);
		}
		
		
		for (i=1; i<=minh; i++)
		{
			if (nivel[i]!=-1)
			{
				 if (gut[nivel[i]].h<=H) {
					printf ("Iau gutuia %ld de pe nivelul %ld\n",gut[nivel[i]].w,i);
					gout += gut[nivel[i]].w;
					H -= U;
				}
			}
		}
		
		// afisam greutatea maxima pe care o poate culege Gigel in fisier
		fprintf (fout,"%ld\n",gout);
		
		// inchidem fisierele
		fclose(fin);
		fclose(fout);
		return 0;
	}