Cod sursa(job #435648)

Utilizator berilacGutu Gabriel berilac Data 7 aprilie 2010 18:45:44
Problema Gutui Scor 10
Compilator c Status done
Runda teme_upb Marime 3.57 kb

	/*
	 * Gutu Marius Gabriel
	 * 321CA
	 * 
	 * Proiectarea Algoritmilor
	 * Tema 1
	 * Gutui
	 */
	
	#include <stdio.h>
	#include <stdlib.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
			*h,		// vectorul de inaltimi ale gutuilor
			*w;		// vectorul de greutati ale gutuilor
			
		long int
			gout;	// greutatea maxima a gutuilor pe care le poate culege Gigel
			
		long int 
			i, j, 	// contoare auxiliare
			maxh, 	// inaltimea maxima la un moment dat 
			maxg, 	// greutatea maxima a gutuilor de la aceeasi inaltime
			iales;	// marcaj pentru gutuia aleasa la un moment dat
		
		// 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
		w	=	(long int *) calloc (N,sizeof(long int));
		h	=	(long int *) calloc (N,sizeof(long int));
		
		// citim perechile corespunzatoare inaltime-greutate pentru 
		// fiecare gutuie
		for (i=0; i<N; i++)
			fscanf(fin,"%ld %ld",&h[i],&w[i]);
		
		// setam greutatea maxima pe care o poate obtine Gigel la 0
		gout	=	0;
		
		// pornim un ciclu pentru calculul acestei valori
		while (1)
		{
			// cosideram ca gutuia aleasa este prima din vector
			i	=	0;
			// setam inaltimea maxima la 0
			maxh	=	0;
			// si greutatea maxima la 0
			maxg	=	0;
			// si gutuia aleasa la 0
			iales	=	0;
			
			// evitam gutuile la care Gigel nu mai poate ajunge si cele 
			// care au fost culese deja
			while (h[i]>H || h[i]==-1) { i++; }
			
			// daca nu mai exista niciuna disponibila, iesim
			if (i >= N) break;
			
			// ne-am pozitionat pe prima gutuie (in ordinea din vector)
			// la care poate ajunge Gigel si care nu a fost inca culeasa
			
			// punem maximul inaltimii pe aceasta
			maxh = h[i];
			// si maximul greutatii tot pe aceasta
			maxg = w[i];
			// salvam gutuia aleasa
			iales = i;

			// incepand cu aceasta gutuie
			for (j = i; j < N; j++)
				// cautam pana la sfarsitul vectorului o gutuie la care 
				// Gigel inca poate ajunge si care nu a fost culeasa
				if (h[j]<=H && h[j]!=-1)
				{
					// daca inaltimea sa este mai mare decat inaltimea
					// maxima curenta
					if (h[j]>maxh)
					{
						// actualizam inaltimea gutuii, greutatea sa si 
						// marcam gutuia aleasa
						maxh = h[j];
						maxg = w[j];
						iales = j;
					}
					// daca inaltimea sa este egala cu inaltimea maxima 
					// curenta, luam gutuia mai grea
					else if (h[j]==maxh)
					{
						// daca gutuia este mai grea decat greutatea 
						// maxima
						if (w[j]>maxg)
						{
							// actualizam inaltimea gutuii, greutatea sa
							// si marcam gutuia aleasa
							maxh = h[j];
							maxg = w[j];
							iales = j;
						}
					}
					
					// actualizam inaltimile tuturor gutuilor, indiferent 
					// ce gutuie s-a ales
					h[j] += U;
				}
			
			// in acest moment, gutuia aleasa este cea care se afla la 
			// inaltimea cea mai mare in limita H si cea mai eficienta 
			// din punct de vedere al greutatii daca exista doua gutui
			// la aceeasi inaltime
			
			// adaugam greutatea ei la greutatea maxima pe care o poate
			// obtine Gigel
			gout	+=	maxg;
			
			// marcam gutuia ca si culeasa
			h[iales]	=	-1;		
		}
		
		// afisam greutatea maxima pe care o poate culege Gigel in fisier
		fprintf (fout,"%ld\n",gout);
		
		// inchidem fisierele
		fclose(fin);
		fclose(fout);
		return 0;
	}