/*
Nume:Ene
Prenume:Stefan
Grupa:321CA
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct {
int greutate;
int inaltime;
int folosit;
}Fruct;
//In aceasta structura pastrez informatiile despre fiecare gutuie,inaltimea ,greutatea si folosit (daca am cercetat acea gutuie) (0 nefolosita si 1 folosita)
void quicksort(int n,Fruct arr[n] ,int low, int high) {
int i = low;
int j = high;
Fruct y;
int z = arr[(low + high) / 2].inaltime;
do {
while(arr[i].inaltime > z) i++;
while(arr[j].inaltime < z) j--;
if(i <= j) {
y = arr[i];
arr[i] = arr[j];
arr[j] = y;
i++;
j--;
}
} while(i <= j);
if(low < j)
quicksort(n,arr, low, j);
if(i < high)
quicksort(n,arr, i, high);
}
//Am folosit un quichsort ca sa sortez vectorul de fructe dupa inaltime si pe urma subvectorii de aceeasi inaltime dupa greutate
//Algoritmul si codul de quicksort a fost luat de pe net
void quicksort2(int n,Fruct arr[n] ,int low, int high) {
int i = low;
int j = high;
Fruct y;
int z = arr[(low + high) / 2].greutate;
do {
while(arr[i].greutate > z) i++;
//gasesc elementul de jos
while(arr[j].greutate < z) j--;
if(i <= j) {
//interschimb 2 elemente
y = arr[i];
arr[i] = arr[j];
arr[j] = y;
i++;
j--;
}
} while(i <= j);
if(low < j)
quicksort2(n,arr, low, j);
if(i < high)
quicksort2(n,arr, i, high);
}
//sortez subvectorul de gutui dupa greutate ,inceput si sfarsit reprezinta marginile subvectorului
int gasit_numar_mai_mic(int n,int contor,int *vector_suma,int aux)//aceasta functie cauta daca exista o gutuie in vectorul de gutui dorite a fi culese ,mai mica ca si greutate decat o alta gutuie.
{
int i,mic = vector_suma[0];
for(i = 0; i < contor ; i++)
if(mic > vector_suma[i])
mic = vector_suma[i];
//caut cea mai mica gutuie din vector
if(aux > mic)//daca gutuia care as dori sa o introduc in vector este mai mare decat cea mai mica existenta o voi introduce,altfel nu fac nimic la vectorul de gutui dat spre cules
{
for(i = 0; i < contor ; i++)
if(mic == vector_suma[i]){
vector_suma[i] = aux;
}
return 1;
}
return 0;
//0 si 1 doar valori pentru verificare
}
void functie1(int n,int H,int U,int interval_timp,int vector_suma[interval_timp],int contor,Fruct fruct[n])//in aceasta functie verific daca o gutuie poate sa fie introdusa direct in vectorul de gutui dorit sa se culeaga sau daca trebuie sa vad daca merge sa nu introdusa in locul celei mai mici gutui
{
int i,gasit;
for(i = 0; i < n ; i++)
{
gasit = 0;
if(fruct[i].inaltime + ( contor * U ) <= H)
{
vector_suma[contor] = fruct[i].greutate;
contor = contor + 1;
fruct[i].folosit = 1;
}
// maresc contorul fiindca am marit vectorul cu o gutuie.
if(fruct[i].inaltime + ( contor * U ) > H && fruct[i].folosit == 0)
{
gasit = gasit_numar_mai_mic(n,contor,vector_suma,fruct[i].greutate);
}
// nu maresc contorul fiindca in cel mai bun caz am inlocuit gutuia cea mai mica cu una mai mare
}
if(contor > interval_timp)
printf("EROARE\n");
//pentru verificare
int sum = 0;
for(i = 0; i < contor ; i++)
{
sum = sum + vector_suma[i];
}
//in sum se afla suma culeasa de Gigel
FILE *f;
f=fopen("gutui.out","w");
fprintf(f,"%d",sum);
fclose(f);
}
int main ()
{
FILE *f;
f = fopen("gutui.in","r");
int n;
fscanf(f,"%d",&n);
int H,U;
fscanf(f,"%d %d",&H,&U);
Fruct fruct[n];
int i,j;
for(i = 0 ;i < n ;i++)
{
fscanf(f,"%d %d",&fruct[i].inaltime,&fruct[i].greutate);
fruct[i].folosit = 0;
}
quicksort(n,fruct,0,n-1);
int interval_timp = (H / U) + 1;
int vector_suma[interval_timp];
int contor = 0;
functie1(n,H,U,interval_timp,vector_suma,contor,fruct);
fclose(f);
return 0;
}