Cod sursa(job #439006)

Utilizator ShmazZamfirache Virgil Shmaz Data 11 aprilie 2010 11:28:56
Problema Gutui Scor 100
Compilator cpp Status done
Runda teme_upb Marime 3.35 kb
/* Zamfirache Virgil - 323CC
 * PA - TEMA 1 - PROBLEMA 2*/

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

using namespace std;

//Structura pentru o gutuie 
typedef struct gutuie { 
		int height;
        int weight;     
}gutuie;


//Functie comparare pentru qSort
int compare(const void* a,const void* b)
{	
    return - ( ( ( const gutuie * ) a) -> weight - ( ( const gutuie * ) b ) -> weight);

}


//Functie pentru dezalocare de matrici
void free_matrix( int n, int **a)
{
	int i;
	for ( i = 0 ; i < n ; i++) {
		free( a[ i ] );
	}
	free( a );
}

//Functie pentru alegerea gutuilor ce dau profit maxim
void profit_gutui( gutuie *gutui, int N, int H, int U, int HMIN )
{   
	FILE *out ;

    out =  fopen ( "gutui.out", "w" );
    
    int i , j, nr_alese = 0 ,  w_max = 0;
    int *aux;
    
	int ax = 1 + ( ( H - HMIN ) / U ) ;
    
	//Vector auxiliar ce contine atatea elemente cate nivele ( gutui maxime ce pot fi culese ) sunt.
    aux = ( int *  ) malloc ( sizeof ( int ) * ax  )  ; 
	memset ( aux, -1,  sizeof(aux) *ax );
	
	//for ( i = 0 ; i < ax ; i ++ ) 
	//	cout<<", "<<aux[ i ] ;
	
	//Sortam vectorul de structuri gutui, in functie de greutatea gutuilor, descrescator
	qsort((void *) gutui,               // Adresa de inceput al vectorului de structuri
        N,                              // Numarul de gutui
        sizeof( gutuie ),               // Dimensiunea structurii gutuie
        compare );                      // Pointer la functia de comparare de structuri "gutui"


	//Pentru fiecare dintre gutui	
	for ( i = 0 ; i < N ; i++ ) {
	    
		//Pentru fiecare din spatiile din vectorul auxiliar
		for ( j = ( H - gutui[ i ].height ) / U  ; j >= 0 ; j --  ) {
			
			// Daca avem spatiu liber
			if ( aux [ j ] == -1 ) {
			   	
				//Marcheaza spatiul ca fiind ocupat si aduna greutatea gutuiei alese la profitul total 
                aux[ j ] =  1 ;
				w_max += gutui[ i ].weight ;  
				nr_alese++ ; 	  
				break;
            
			}
   
			   
		}
		//Daca s-au ales toate gutuile -> iesi
		if ( nr_alese == ax)
		   break ;
	
	}
	
	//cout<<" w: "<<w_max;
	//system("pause");
	// Scriere rezultat in fisierul de iesire
	fprintf ( out , "%d", w_max);
    fclose ( out ) ;
		
}

//Functie de citire din fisier in vectorul de structuri gutui
void read( char *fname , gutuie **gutui, int *N, int *H, int *U , int *HMIN)
{
    FILE *in ;
    int i;
    in =  fopen ( fname, "r" );
    *HMIN = INT_MAX ;
    
    fscanf(in, "%d", N);
    fscanf(in, "%d", H);
    fscanf(in, "%d", U);
	
	//Aloca vectorul de structuri gutui si citeste din fisier
	*gutui = ( gutuie * )calloc( ( * N ), sizeof( gutuie));

	for ( i = 0; i < *N ; i++) {
			
			fscanf ( in, "%d", & ( ( *gutui)[ i ].height) );
			fscanf ( in, "%d", & ( ( *gutui)[ i ].weight) );

			if ( ( * gutui )[ i ].height < *HMIN ){
			   *HMIN = ( * gutui )[ i ].height;
            }
	}

	fclose ( in );
}

int main()
{
    gutuie *gutui;
    
    /*
	N (numarul de gutui din copac), 
	H (inaltimea maxima la care ajunge Gigel) si 
	U (cu cat se ridica crengile copacului dupa culegerea unei gutui).*/
	
    int N, H, U, HMIN;
    char in_name[ ] = "gutui.in";
	
    read( in_name, &gutui , &N, &H, &U, &HMIN);

    profit_gutui( gutui, N, H, U, HMIN );

    return 0;
}