/* 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)
{
const gutuie *ia = (const gutuie *)a; // casting pointer types
const gutuie *ib = (const gutuie *)b;
return - ( ia->weight - ib->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 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 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;
aux = ( int * ) calloc ( sizeof ( int ) , 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 ] == 0 ) {
aux[ j ] = gutui[ i ].weight ;
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;
}