Cod sursa(job #439669)

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

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

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) -> height - ( ( const gutuie * ) b ) -> height);

}

//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 ax = 1 + ( ( H - HMIN ) / U ) ;
    
	//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"
		
		
	multimap<int,int> aux;
	multimap<int,int>::iterator it;
	
	int jmp = 0 ;
	int old_jmp = -1 ;
	

	
	for ( i = 0 ; i < N ; i ++ ) {
		
		if ( jmp <= gutui[ i ].height ) {
		   
		   aux.insert( pair <int, int > ( gutui[ i ].weight, gutui[ i ].height ) );
           jmp++;  
		   w_max += gutui[ i ].weight; 
		   continue;	 
	    
		}
		
		if ( jmp > gutui[ i ].height ){
	    
		    it = aux.begin();
		    if ( gutui[ i ].weight > (*it).first ) {
	   	        w_max -= ( *it ).first ;
			    w_max += gutui [ i ].weight;
	   	        aux.erase( it );
			    aux.insert( pair <int, int > ( gutui[ i ].weight, gutui[ i ].height ) );  
				continue;
	        } 	 
	    
		}
	}

		
//	for ( it=aux.begin() ; it != aux.end(); it++ ) {
//		w_max += (*it).first;
  //  }
		//cout<<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 ;
    int haux;
    
    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", &haux );
			( *gutui)[ i ].height = ( *H - haux )/ *U;
			//( *gutui)[ i ].height =  haux ;
			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;
}