Pagini recente » Cod sursa (job #1728723) | Cod sursa (job #1415169) | Cod sursa (job #752347) | Cod sursa (job #2967410) | Cod sursa (job #442434)
Cod sursa(job #442434)
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int h,g; //structura de gutui cu campurile h=inaltime, g=greutate
} gutuie;
int comp(const void *a,const void *b) //functia de sortare descrescator dupa inalitme pentru quicksort
{
gutuie *aa=(gutuie*)a;
gutuie *bb=(gutuie*)b;
return (*bb).h-(*aa).h;
}
int actualizeaza(int cules[], int n, gutuie c) //returneaza min(minimul din vectorul de cules sau gutuia care tocmai a fost scoasa)
{
int min=cules[0],i,im=0;
for(i=1;i<n;i++) //calculez minimul din vectorul de cules
if(min>cules[i])
{
min=cules[i];
im=i;
}
if(c.g>min) //daca gutuia curenta e mai grea decat greutatea minima din vectorul de cules,
cules[im]=c.g; //o inlocuiesc cu cea curenta
return min;
}
int main()
{
int i,j=0,n,hmax,u,suma=0,m=-1; //m e folosit pentru optimizare
FILE* fin=fopen("gutui.in","rt");
FILE* fout=fopen("gutui.out","wt");
gutuie c;
fscanf(fin,"%i %i %i",&n,&hmax,&u);
gutuie vg[n]; //vg=vectorul de gutui
for(i=0;i<n;i++)
fscanf(fin,"%i %i",&vg[i].h,&vg[i].g);
int cules[n]; //cules=vectorul in care o sa pun greutatile gutuilor culese
qsort(vg,n,sizeof(gutuie),comp); //sortarea dupa inaltime a vectorului de gutui
for(i=0;i<n;i++)
{
c=vg[i]; //iau fiecare gutuie din vector
if(c.h<=hmax) //verific daca in momentul de fata se poate lua
{
cules[j]=c.g; //daca da, ii pun greutatea in vectorul de cules
j++; //cresc indicele in vectorul de cules
hmax=hmax-u; //si cresc inaltimea crengilor prin scaderea lui hmax
if(c.g<m)
m=c.g; //actualizez minimul din vectorul de cules daca este cazul
}
else //daca nu se mai poate lua in momentul de fata
if(c.g>m) //daca gutuia curenta nu este mai grea decat min, nu mai are rost sa o verific
m=actualizeaza(cules,j,c); //in schimb, daca e mai grea decat min, se poate sa fie mai grea decat cea mai usoara gutuie culeasa deja (daca min a fost gutuia care tocmai a fost scoasa)
} //si verific daca are greutatea mai mare ca vreo gutuie deja culeasa, iar daca da, o culeg pe aceasta si renunt la gutuia mai usoara
for(i=0;i<j;i++)
suma=suma+cules[i]; //suma gutuilor culese -> rezultatul cautat
fprintf(fout,"%i\n",suma);
fclose(fin);
fclose(fout);
return 0;
}