#include <stdio.h>
#include <stdlib.h>
typedef struct {
long int h;
long int hInitial;
long int g;
int culeasa; // variabila bool
} gutui;
int existaParaAccesibila(gutui v[], long N) {
long i;
for (i = 0; i < N; i++)
if (v[i].h > 0)
return 1;
return 0;
}
long int nr_pasi(long int H, long int h, long int U) { // de verificat
long int i;
i = H - h;
if (i < 0)
return 0;
i = i / U;
return i + 1;
}
int cmp(const void *x1, const void *x2) {
long int h1, h2, g1, g2;
long diferenta;
h1 = ((gutui *)x1)-> h;
g1 = ((gutui *)x1)-> g;
h2 = ((gutui *)x2)-> h;
g2 = ((gutui *)x2)-> g;
if (h1 <= 0)
return 1;
if (h2 <= 0)
return -1;
if (h1 > h2)
return 1;
if (h1 == h2) {
diferenta = g2 - g1;
if (diferenta > 0)
return 1;
if (diferenta < 0)
return -1;
return 0;
}
if (h1 < h2)
return -1;
}
int main () {
FILE *fp;
long NGutuiCulese = 0;
long NGutuiRamase;
long N, i, j, k;
long int H, U, cantitate_max;
gutui *v;
gutui aux;
gutui *gutuiCulese, *gutuiRamase;
int EPA; // variabila booleana care precizeaza daca exista para accesibila
fp = fopen("gutui.in", "r");
fscanf(fp, "%ld%ld%ld", &N, &H, &U);
v = (gutui *)malloc(N * sizeof(gutui));
for (i = 0; i < N; i++) {
fscanf(fp, "%ld%ld", &v[i].h, &v[i].g);
v[i].culeasa = 0;
}
fclose(fp);
// afisare date citite
//1 printf("%d %d %d\n", N, H, U);
/*2 for (i = 0; i < N; i++)
printf("%d %d\n", v[i].h, v[i].g);
*/
// h va retine numarul de pasi efectuati in procesul de recoltare
// a gutuilor dupa care ele devin inaccesibile
for (i = 0; i < N; i++)
v[i].h = v[i].hInitial = nr_pasi(H, v[i].h, U);
/*5
printf("\n\nVector prelucrat:\n");
for (i = 0; i < N; i++)
printf("%d %d\n", v[i].h, v[i].g);
*/
cantitate_max = 0;
EPA = existaParaAccesibila(v, N);
while (EPA) {
qsort(v, N, sizeof(gutui), cmp);
/*3
printf("\n\nVector sortat:\n");
for (i = 0; i < N; i++)
printf("%d %d\n", v[i].h, v[i].g);
*/
/* long j= 0;
long pasi = v[0].h;
while (j < N) {
j++;
} */
v[0].culeasa = 1;
NGutuiCulese ++;
cantitate_max += v[0].g;
v[0].h = 0;
for (i = 0; i < N; i++)
v[i].h --;
//4 printf("cantitate: %d\n", cantitate_max);
EPA = existaParaAccesibila(v, N);
}
NGutuiRamase = N - NGutuiCulese;
gutuiCulese = (gutui *)malloc(NGutuiCulese * sizeof(gutui));
gutuiRamase = (gutui *)malloc(NGutuiRamase * sizeof(gutui));
j = k = 0;
for (i = 0; i < N; i++)
if (v[i].culeasa) {
gutuiCulese[j] = v[i];
gutuiCulese[j].h = gutuiCulese[j].hInitial;
j++;
}
else {
gutuiRamase[k] = v[i];
gutuiRamase[k].h = gutuiRamase[k].hInitial;
k++;
}
// printf("NGutuiCulese -- j :: %d -- %d\n", NGutuiCulese, j);
// printf("NGutuiRamase -- k :: %d -- %d\n", NGutuiRamase, k);
i = 0;
while (i < NGutuiCulese) {
qsort(gutuiCulese, NGutuiCulese, sizeof(gutui), cmp);
qsort(gutuiRamase, NGutuiRamase, sizeof(gutui), cmp);
for (j = 0; j < NGutuiRamase; j++)
if (gutuiRamase[j].g > gutuiCulese[i].g) {
/*6 if (gutuiRamase[j].h <= gutuiCulese[i].h)
printf("EROARE\n");
*/
cantitate_max = cantitate_max - gutuiCulese[i].g;
aux = gutuiCulese[i];
gutuiCulese[i] = gutuiRamase[j];
gutuiRamase[j] = aux;
cantitate_max = cantitate_max + gutuiCulese[i].g;
}
i++;
}
//7 printf("cantitate: %d\n", cantitate_max);
fp = fopen("gutui.out", "w");
fprintf(fp, "%ld", cantitate_max);
fclose(fp);
//8 system("pause");
return 0;
}