Cod sursa(job #440968)
#include <stdio.h>
#include <stdlib.h>
FILE *f;
int N, H, U, greutate_maxima = 0;
// N -numarul de gutui din copac
//H-inaltimea maxima la care ajunge Gigel
//U-cu cat se ridica crengile copacului dupa culegerea unei gutui
//greutate_maxima -greutatea maxima a gutuilor pe care le poate culege Gigel
typedef struct gutui
{
int inaltime;// inaltimea si greutatea gutuilor din copac
int greutate;
int nivel ; // impart gutuiul in nivele in functie de inaltimea gutuilor fata de sol
int cules; //poate fi zero sau unu
}date_gutui;
date_gutui v[100000]; // vector in care retin inaltimea si greutatea gutuilor
void read_file (const char *fis)
{
int i;
//date_gutui gutui;
f = fopen (fis, "r");
fscanf (f, "%d", &N); // numarul de gutui din copac
fscanf (f, "%d", &H); // inaltimea maxima la care ajunge Gigel
fscanf (f, "%d", &U); // cu cat se ridica crengile copacului dupa culegerea unei gutui
// pe urmatirele N linii ale fisierului sunt date referitoare la inaltimea si greutatea gutuilor din copac
for(i=0; i<N; i++)
{
// inaltimea si greutatea gutuilor le bag intr-un vector
fscanf (f, "%d", &v[i].inaltime);
fscanf (f, "%d", &v[i].greutate);
}
fclose(f);
}
void print_file (const char *fis , int greutate_maxima)
{
// date_gutui gutui;
f = fopen(fis, "w");
fprintf (f, "%d ", N);
fprintf (f, "%d ", H);
fprintf (f, "%d\n", U);
fprintf (f, "%d", greutate_maxima);
fclose(f);
}
int alegNivel() // impart gutuiul in nivele
{
printf("Am %d gutui\n",N);
int i, min = 10000;
int max = -10000;
int niv = 0;
for (i=0; i<N; i++)
{
v[i].nivel = (H - v[i].inaltime)/U + 1; // impart gutuiul in nivele
printf("numarul de niveluri ale gutuiului este : ");
printf("%d\n", v[i].nivel);
}
}
int culegGutui ()
{
int i, j, maxim = -1000, k;
for (j=1; j<H/U; j++) // parcurg gutuiul nivel cu nivel
{
maxim = -1000;
for (i=0; i<N; i++) // parcurg numarul de gutui
{
if (v[i].nivel > 0 && v[i].nivel <= j && v[i].greutate > maxim && v[i].cules == 0) // variabila cules poate fi 0 sau 1 , si-mi indica daca am cules sau nu gutuia
{
maxim = v[i].greutate; // am aflat gutuia cu greutatea maxima
k = i; // in k retin indicele
}
v[i].nivel --; // trec la urmatorul nivel
}
if (maxim > -1000)
{
v[k].cules = 1; // culeg gutuia
greutate_maxima += maxim; // adaug la greutatea maxima greutatea gutuii culese
}
}
printf ("greutatea maxima este : \n");
printf("%d\n", greutate_maxima);
return greutate_maxima;
}
int main()
{
int i;
read_file("gutui.in");
alegNivel();
printf("\n");
culegGutui();
print_file("gutui.out", greutate_maxima);
// getchar();
return 0;
}