Pagini recente » Cod sursa (job #2161695) | Cod sursa (job #2470665) | Cod sursa (job #2650970) | Cod sursa (job #635870) | Cod sursa (job #441565)
Cod sursa(job #441565)
#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++)
{
fscanf (f, "%d", &v[i].inaltime);
fscanf (f, "%d", &v[i].greutate);
}
fclose(f);
}
void print_file (const char *fis , int greutate_maxima)
{
f = fopen(fis, "w");
fprintf (f, "%d", greutate_maxima);
fclose(f);
}
void alegNivel() // impart gutuiul in nivele
{
//printf("Am %d gutui\n",N);
int i;
//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=0;
int nr=0; //numarul de nivele in care n-am ales nici o gutuie;
for (j=1; j<=H/U;) // 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
}
}
for (i=0;i<N;i++)
if (v[i].nivel > 0 && v[i].nivel <= j && v[i].greutate == maxim && v[i].cules == 0 && v[i].nivel < v[k].nivel)
k = i;
if (maxim > -1000)
{
v[k].cules = 1; // culeg gutuia
greutate_maxima += maxim; // adaug la greutatea maxima greutatea gutuii culese
if (nr == 0)
for (i=0;i<N;i++)
v[i].nivel --; // trec la urmatorul nivel
else
nr--;
}
else
{
j++;
nr++;
}
}
// 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;
}