#include <stdio.h>
#include <string.h>
// nr gutui, inaltimea maxima, inaltarea, rezultatul final
long n, hi, u, smax;
// inantimea fiecarei gutui si greutatea
long h[100001], w[100001], i, j, aux;
long hmin, h1[100001], w1[100001], indici[100001], imax1, imax2, max1, max2, nrx, x;
void update()
{
for(i=0; i<n; i++)
h[i]+=u;
// nu are sens sa pastram in vectorii h si w valorile pentru fructele care nu mai pot fi accesate (sunt prea sus)
j=0;
for(i=0; i<n; i++)
if(h[i]<=hi)
{
h1[j]=h[i];
w1[j]=w[i];
j++;
}
n=j;
for(i=0; i<n; i++)
{
h[i]=h1[i];
w[i]=w1[i];
}
}
int main()
{
FILE *f=fopen("gutui2.in", "r");
FILE *g=fopen("gutui.out", "w");
fscanf(f, "%ld %ld %ld", &n, &hi, &u);
for(i=0; i<n; i++)
fscanf(f, "%ld %ld", &h[i], &w[i]);
/* for(i=0; i<n; i++)
printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
*/
//sortam descrescator fructele, in functie de inaltime
//trebuie inlocuit cu quicksort, de exemplu
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
if(h[i]<h[j])
{
aux=h[i];
h[i]=h[j];
h[j]=aux;
aux=w[i];
w[i]=w[j];
w[j]=aux;
}
printf("Dupa quicksort: \n");
for(i=0; i<n; i++)
printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
hmin=h[n-1];
smax=0;
// printf("hmin este: %ld\n", hmin);
//pana aici sigur e bine
while(n>0)
{ // fructele sunt mereu ordonate descrescator in functie de h[i]
max1=0, imax1=-1, x=-1;
printf("*************************\n");
printf("Numarul de fructe este: %ld\n", n);
for(i=0; i<n; i++)
if(h[i]+u> hi) // primele x+1 numere sunt in pericol de a deveni inaccesibile dupa o culegere
{
x=i;
if(w[i]>max1)
{
//printf("%ld este mai mic decat elementul cu greutatea %ld\n", max1, w[i]);
imax1=i;
max1=w[imax1];
}
} // la final vom avea x, indicele ultimului fruct in pericol, indicele fructului maxim din cele in pericol, si valoarea maxima
printf("Cate fructe sunt in pericol: %ld\n", x+1);
for(i=0; i<x+1; i++)
printf("fruct in pericol: indice %ld de inaltime %ld si greutate %ld\n", i, h[i], w[i]);
printf("maximul dintre fructele in pericol este fructul %ld de inaltime %ld si greutate %ld\n", imax1, h[imax1], w[imax1]);
if(x==-1)
{
// daca x a ramas -1 atunci inseamna ca nu avem niciun fruct in pericol, si pur si simplu alegem maximul total
max1=0, imax1=-1;
//printf("oi \n");
for(i=0; i<n; i++)
if(w[i]>max1)
{
imax1=i;
max1=w[imax1];
}
smax+=max1;
for(i=imax1+1; i<n; i++)
{ // stergem fructul cules
h[i-1]=h[i];
w[i-1]=w[i];
}
n--;
//update();
printf("Dupa culegere sunt %ld fructe:\n", n);
for(i=0; i<n; i++)
printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
update();
printf("Dupa update sunt %ld fructe:\n", n);
for(i=0; i<n; i++)
printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
printf("suma in acest moment este %ld\n", smax);
printf("*************************\n");
}
else
{
// restul numerelor, nu sunt in pericol, vedem daca avem dintre acestea doua mai grele decat maximul dintre cele in pericol
nrx=0;
// daca x a ramas -1 atunci inseamna ca nu avem niciun fruct in pericol, si pur si simplu alegem maximul total
for(i=x+1; i<n; i++)
if(w[i]>max1)
nrx++;
// daca exista intre frunctele !in pericol 2 mai grele decat cel mai greu fruct in pericol
if(nrx>=2)
{
printf("situatia speciala!\n");
printf("exista 2 fructe mai grele in afara celor in pericol\n");
imax2=-1, max2=0;
for(i=x+1; i<n; i++)
if(w[i]>max1)
{
max2=w[i];
imax2=i;
}
smax+=max2; //adaugam greutatea fructului la suma totala
for(i=imax2+1; i<n; i++)
{ // stergem fructul cules
h[i-1]=h[i];
w[i-1]=w[i];
}
n--;
//update();
printf("Dupa culegere sunt %ld fructe:\n", n);
for(i=0; i<n; i++)
printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
update();
printf("Dupa update sunt %ld fructe:\n", n);
for(i=0; i<n; i++)
printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
printf("suma in acest moment este %ld\n", smax);
printf("*************************\n");
}
else
{ //altfel, culegem fructul cu greutate maxima dintre fructele in pericol
printf("situatia clasica!\n");
smax+=max1; //adaugam greutatea fructului la suma totala
for(i=imax1+1; i<n; i++)
{ //stergem fructul cules
h[i-1]=h[i];
w[i-1]=w[i];
}
n--;
//update();
printf("Dupa culegere sunt %ld fructe:\n", n);
for(i=0; i<n; i++)
printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
update();
printf("Dupa update sunt %ld fructe:\n", n);
for(i=0; i<n; i++)
printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
printf("suma in acest moment este %ld\n", smax);
printf("*************************\n");
}
}// de la else
} // de la while(n>0)
/*
printf("Ia sa vedem!\n");
for(i=0; i<n; i++)
printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
*/
printf("%ld\n", smax);
fprintf(g, "%ld", smax);
fclose(f);
fclose(g);
return 0;
}