Pagini recente » Cod sursa (job #978009) | Cod sursa (job #2891311) | Cod sursa (job #2769413) | Cod sursa (job #2983647) | Cod sursa (job #435648)
Cod sursa(job #435648)
/*
* Gutu Marius Gabriel
* 321CA
*
* Proiectarea Algoritmilor
* Tema 1
* Gutui
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
/* Variabile principale */
long int
N, // numarul de gutui din copac
H, // inaltimea maxima la care ajunge Gigel
U; // cu cat se ridica crengile copacului dupa culegerea unei gutui
long int
*h, // vectorul de inaltimi ale gutuilor
*w; // vectorul de greutati ale gutuilor
long int
gout; // greutatea maxima a gutuilor pe care le poate culege Gigel
long int
i, j, // contoare auxiliare
maxh, // inaltimea maxima la un moment dat
maxg, // greutatea maxima a gutuilor de la aceeasi inaltime
iales; // marcaj pentru gutuia aleasa la un moment dat
// fisierele de intrare si de iesire
FILE *fin, *fout;
fin = fopen ("gutui.in","r");
fout = fopen ("gutui.out","w");
// citim N, H si U
fscanf(fin,"%ld %ld %ld",&N,&H,&U);
// alocam spatiu pentru vectorul de greutati si pentru cel de
// inaltimi
w = (long int *) calloc (N,sizeof(long int));
h = (long int *) calloc (N,sizeof(long int));
// citim perechile corespunzatoare inaltime-greutate pentru
// fiecare gutuie
for (i=0; i<N; i++)
fscanf(fin,"%ld %ld",&h[i],&w[i]);
// setam greutatea maxima pe care o poate obtine Gigel la 0
gout = 0;
// pornim un ciclu pentru calculul acestei valori
while (1)
{
// cosideram ca gutuia aleasa este prima din vector
i = 0;
// setam inaltimea maxima la 0
maxh = 0;
// si greutatea maxima la 0
maxg = 0;
// si gutuia aleasa la 0
iales = 0;
// evitam gutuile la care Gigel nu mai poate ajunge si cele
// care au fost culese deja
while (h[i]>H || h[i]==-1) { i++; }
// daca nu mai exista niciuna disponibila, iesim
if (i >= N) break;
// ne-am pozitionat pe prima gutuie (in ordinea din vector)
// la care poate ajunge Gigel si care nu a fost inca culeasa
// punem maximul inaltimii pe aceasta
maxh = h[i];
// si maximul greutatii tot pe aceasta
maxg = w[i];
// salvam gutuia aleasa
iales = i;
// incepand cu aceasta gutuie
for (j = i; j < N; j++)
// cautam pana la sfarsitul vectorului o gutuie la care
// Gigel inca poate ajunge si care nu a fost culeasa
if (h[j]<=H && h[j]!=-1)
{
// daca inaltimea sa este mai mare decat inaltimea
// maxima curenta
if (h[j]>maxh)
{
// actualizam inaltimea gutuii, greutatea sa si
// marcam gutuia aleasa
maxh = h[j];
maxg = w[j];
iales = j;
}
// daca inaltimea sa este egala cu inaltimea maxima
// curenta, luam gutuia mai grea
else if (h[j]==maxh)
{
// daca gutuia este mai grea decat greutatea
// maxima
if (w[j]>maxg)
{
// actualizam inaltimea gutuii, greutatea sa
// si marcam gutuia aleasa
maxh = h[j];
maxg = w[j];
iales = j;
}
}
// actualizam inaltimile tuturor gutuilor, indiferent
// ce gutuie s-a ales
h[j] += U;
}
// in acest moment, gutuia aleasa este cea care se afla la
// inaltimea cea mai mare in limita H si cea mai eficienta
// din punct de vedere al greutatii daca exista doua gutui
// la aceeasi inaltime
// adaugam greutatea ei la greutatea maxima pe care o poate
// obtine Gigel
gout += maxg;
// marcam gutuia ca si culeasa
h[iales] = -1;
}
// afisam greutatea maxima pe care o poate culege Gigel in fisier
fprintf (fout,"%ld\n",gout);
// inchidem fisierele
fclose(fin);
fclose(fout);
return 0;
}