//Voinea Maria Anemona 321CA
//--------Tema 1 PA---------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int partition (int *a, int *b, int start, int stop, int pivot) {
int pival=a[pivot];
int aux, i, j=start;
aux = a[pivot];
a[pivot] = a[stop];
a[stop] = aux;
aux = b[pivot];
b[pivot] = b[stop];
b[stop] = aux;
for (i = start; i < stop; i++)
if (a[i] > pival)
{
aux = a[i];
a[i] = a[j];
a[j] = aux;
aux = b[i];
b[i] = b[j];
b[j] = aux;
j++;
}
aux = a[j];
a[j] = a[stop];
a[stop] = aux;
aux = b[j];
b[j] = b[stop];
b[stop] = aux;
return j;
}
void quicksort(int *a, int *b, int start, int stop)
{
if (stop > start)
{
int pivot = (start+stop)/2;
int pivotnou = partition(a, b, start, stop, pivot);
quicksort(a, b, start, pivotnou);
quicksort(a, b, pivotnou + 1, stop);
}
}
int main()
{
FILE *in, *out;
int i, N, H, U, *h, *g, G=0, gutui=0, etape=0, curent=0;
char s[50], *ordine;
in = fopen("gutui.in", "r");
out = fopen("gutui.out", "w");
fgets(s, 50, in);
sscanf(s, "%d%d%d", &N, &H, &U);
//printf("%d %d %d\n", N, H, U);
h = (int*)malloc(N*sizeof(int));
g = (int*)malloc(N*sizeof(int));
for(i=0; i<N; i++)
{
fgets(s, 50, in);
sscanf(s, "%d%d", h+i, g+i);
}
fclose(in);
//Calculul numarului maxim de gutui culese (numarul de etape ale culesului)
for(i=0; i<N; i++)
{
if( H-h[i] >= 0 && (H-h[i]) / U + 1 > etape )
etape = (H-h[i]) / U + 1;
}
//printf("Etape: %d\n", etape);
if(!etape)
{
fprintf(out, "0"); //nu se poate culege nimic
return 0;
}
//Sortare dupa greutate
quicksort(g, h, 0, N-1);
ordine = (char*)malloc(etape*sizeof(char));
memset(ordine, -1, etape);
for(i=0; i<etape; i++)
printf("%d ", ordine[i]);
for(curent=0; curent < N && gutui < etape; curent++)
{
if(H - h[curent] >= 0) //etapa maxima la care se poate culege gutuia curenta
{
i = (H - h[curent]) / U;
//Daca a mai fost culeasa o gutuie in etapa i, incearca etapa anterioara
while( i >= 0 && ordine[i] > 0)
i--;
if(i >= 0) //daca s-a putut alege gutuia
{
G += g[curent];
ordine[i] = 1;
gutui++;
printf("Culeasa cea de inaltime %d si de greutate %d\n", h[curent], g[curent]);
}
}
}
fprintf(out, "%d", G);
fclose(out);
free(h);
free(g);
free(ordine);
return 0;
}