/* 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++;
continue;
}
if ( jmp > gutui[ i ].height ){
it = aux.begin();
if ( gutui[ i ].weight > (*it).first ) {
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;
}
//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;
}