Cod sursa(job #434227)

Utilizator ShmazZamfirache Virgil Shmaz Data 5 aprilie 2010 13:46:29
Problema Gutui Scor 0
Compilator cpp Status done
Runda teme_upb Marime 3.45 kb
/* Zamfirache Virgil - 323CC
 * PA - TEMA 1 - PROBLEMA 2*/

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

using namespace std;

int max2( int a, int b  )
{
    int max ;
    
    max = ( a > b ) ? a : b ;
    
    return max;    
    
}

void free_matrix( int n, int **a) {
	int i;
	for ( i = 0 ; i < n ; i++) {
		free( a[ i ] );
	}
	free( a );
}

void insertionSort( int * height, int *weight, int N ) {

      int i, j, tmp;

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

            j = i;

            while (j > 0 && weight[j - 1] < weight[j]) {

                  tmp = height[j];
                  height[j] = height[j - 1];
                  height[j - 1] = tmp;

                  tmp = weight[j];
                  weight[j] = weight[j - 1];
                  weight[j - 1] = tmp;

                  j--;
            }
      }
}

void gutui( int * height, int *weight, int N, int H, int U, int HMIN )
{   
	vector<int> asd;
	FILE *out ;
 
    out =  fopen ( "gutui.out", "w" );
    
    int i , j, nr_alese = 0 ,  w_max = 0;
    int *aux;
    
    aux = ( int *  ) calloc ( sizeof ( int ) , 1 + (( H - HMIN ) / U)  )  ; 
	   
    insertionSort ( height, weight, N );
	int ax = 1 + (( H - HMIN ) / U) ;
/*	for ( i = 0 ; i < N ; i ++ ) {
			cout<<"h: "<<height[i]<<" w:" << weight[i]<<endl;
	}*/
	//cout<<"AX: "<<ax;
	for ( i = 0 ; i < N ; i++ ) {

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

			if ( aux [ j ] == 0 ) {
			    aux[ j ]  = weight[ i ] ;
				w_max += weight[ i ] ;  
				nr_alese++ ; 	  
				break;
            }
   
			   
		}
		if ( nr_alese == ax)
		   break ;
	
	}
			
	//cout<<"w_max: "<<w_max<<endl;
	fprintf ( out , "%d", 1);
    fclose ( out ) ;
	
   // system("pause");	
}


void read( char *fname , int **height, int **weight , int *N, int *H, int *U , int *HMIN)
{
    FILE *in ;
    int i, j ;
	int w_temp , h_temp, tmp;
    
	in =  fopen ( fname, "r" );
    *HMIN = INT_MAX ;
    fscanf(in, "%d", N);
    fscanf(in, "%d", H);
    fscanf(in, "%d", U);
	
	// elementele matricei A
	*height = (int*)calloc(( *N ) , sizeof(int));
	*weight = (int*)calloc(( *N ) , sizeof(int));
	
	for ( i = 0; i < *N ; i++) {

			//fscanf(in, "%d", &( ( *height )[ i ] ));
			//fscanf(in, "%d", &( ( *weight )[ i ] ));
			fscanf(in, "%d", &h_temp );
			fscanf(in, "%d", &w_temp );
			
			j = i ; 
			
			(*weight)[ i ] = w_temp;
			(*height)[ i ] = h_temp ;
			
			if ( (*height)[i] < *HMIN ){
			   *HMIN = (*height)[ i ];
            }
			/*while ( j > 0  && (*weight) [ j - 1 ] < (*weight) [ j ] ) {
				  
                tmp = (*height)[j];
                (*height)[j] = (*height)[j - 1];
                (*height)[j - 1] = tmp;

                tmp = (*weight)[j];
                (*weight)[j] = (*weight)[j - 1];
                (*weight)[j - 1] = tmp;

                j--;	  
	            
			}*/
	}

	fclose ( in );
}

int main()
{
    int *height, *weight;
    int i;
    /*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, &height, &weight, &N, &H, &U, &HMIN);

//	for ( i = 0 ; i < N ; i ++ )
	//	cout<<"h: "<<height[i]<<" w:" << weight[i]<<endl;
	//cout<<"AA";	
    gutui( height, weight, N, H, U, HMIN );
	//system("pause");
    return 0;
}