Cod sursa(job #441580)

Utilizator berilacGutu Gabriel berilac Data 12 aprilie 2010 23:24:20
Problema Gutui Scor 10
Compilator c Status done
Runda teme_upb Marime 3.6 kb

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

	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;*/
	  if(((gutuie *)a)->h < ((gutuie *)b)->h)
	  return ((gutuie*)b)->w - ((gutuie*)a)->w;
	  return ((gutuie*)b)->h - ((gutuie*)a)->h;
	}
	/*int compare (const void * a, const void * b)
	{
	  if((gutuie *)a->h(gutuie *)b->h)return ( *(long int*)gut[a].h - *(long int*)gut[b].h );
	  return ( *(long int*)gut[a].w - *(long int*)gut[b].w );
	}*/
		
	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 ("gutui.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
		/*sortat = 0;
		do
		{
			sortat = 1;
			for (i=0; i<N-1; i++)
				if (w[i]<w[i+1])
				{
					sortat = 0;
					aux = w[i];
					w[i] = w[i+1];
					w[i+1] = aux;
					aux = h[i];
					h[i] = h[i+1];
					h[i+1] = aux;
				}
				else if (w[i]==w[i+1])
				{
					// sortez dupa h
					if (h[i]<h[i+1])
					{
						sortat = 0;
						aux = w[i];
						w[i] = w[i+1];
						w[i+1] = aux;
						aux = h[i];
						h[i] = h[i+1];
						h[i+1] = aux;
					}
				}
		} while (sortat == 0);*/
		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;
		minh++;
		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)
			{
				//printf (" %ld ",nivel[i][0]);
				//for (j=1; j<=nivel[i][0]; j++)
				 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;
	}