Cod sursa(job #434281)

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

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

using namespace std;

typedef struct gutuie { 
		int height;
        int weight;     
}gutuie;


// Functii sortare 
//typedef int (*compfn)(const void*, const void*);

int compare(const void* a,const void* b)
{	
    return - ( ((const gutuie *) a)->weight - ((const gutuie *) b)->weight);

}

// Functie ce returneaza maximul dintre 2 numere
int max2( int a, int b  )
{
    int max ;
    
    max = ( a > b ) ? a : b ;
    
    return max;    
    
}

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


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;
    bool *aux;
    
    aux = ( bool *  ) calloc ( sizeof ( bool ) , 1 + (( H - HMIN ) / U)  )  ; 

	qsort((void *) gutui,               // Beginning address of array
        N,                              // Number of elements in array
        sizeof( gutuie ),               // Size of each element
        compare );                      // Pointer to compare function

	int ax = 1 + (( H - HMIN ) / U) ;

		
	for ( i = 0 ; i < N ; i++ ) {

		for ( j = ( H - gutui[ i ].height ) / U  ; j >= 0 ; j --  ) {

			if ( aux [ j ] == false ) {
			    //aux[ j ]  = gutui[ i ].weight ;
			    aux[ j ] =  true ;
				w_max += gutui[ i ].weight ;  
				nr_alese++ ; 	  
				break;
            }
   
			   
		}
		if ( nr_alese == ax)
		   break ;
	
	}
	
   /* for ( int i = 0 ; i < N ; i++) {
		cout<<"H: "<<gutui[ i ].height<<" W: "<<gutui[ i ].weight<<endl;
    }*/

	//cout<<"w_max: "<<w_max<<endl;
	fprintf ( out , "%d", w_max);
    fclose ( out ) ;
	
  //  system("pause");	
}


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);

	*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 );
   	//cout<<" ";
	//system("pause");
    return 0;
}