Pagini recente » Cod sursa (job #2595270) | Cod sursa (job #2060345) | Cod sursa (job #891252) | Cod sursa (job #2930399) | Cod sursa (job #439999)
Cod sursa(job #439999)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int *sol;
typedef struct
{
unsigned int poz; // pozitia minimului in vectorul de solutie
unsigned int val; // valoarea minimului
} valminime; // structua de tip minim
typedef struct info_gutuie
{unsigned int h; // inaltimea gutuii
unsigned int g; //greutatea gutuii
} GUTUIE;
GUTUIE *gutuie;
int relatie (GUTUIE *nr1, GUTUIE *nr2) // ordonare dupa inaltimi iar in caz de egalitate dupa greutate
{
if ((*nr1).h < (*nr2).h) { return 1;}
if ((*nr1).h > (*nr2).h) return -1;
if ((*nr1).h == (*nr2).h) { if ((*nr1).g < (*nr2).g ) return 1;
if ((*nr1).g == (*nr2).g) return 0;
if ((*nr1).g>(*nr2).g) return -1;
}
}
int main()
{
unsigned int n,h,u;
long int suma=0;
int i,j,m,k,nrg,min,culese=0;
FILE *in, *out;
in=fopen ("gutui.in", "r");
out=fopen ("gutui.out","w");
fscanf (in,"%u",&n); //nr gutui
valminime *vmin; // vector de minim
gutuie =(GUTUIE*) calloc (n,sizeof (GUTUIE));
sol=(int *) calloc(n,sizeof(int)); // vectorul de solutii
vmin=(valminime*) calloc (n,sizeof(valminime));
fscanf (in,"%u",&h); //inaltime maxima
fscanf (in,"%u", &u); //inaltime gutuie
for (i=0;i<n;i++) //citire date
{fscanf (in,"%u", &gutuie[i].h);
fscanf (in,"%u",&gutuie[i].g);}
j=0; // retine numarul de elemente din vectorul de minim
min=0; // intial minimul este 0
for (i=0;i<n;i++)
if (gutuie[i].h<min) min=gutuie[i].h; // nivelul minim al arborelui
nrg= (h-min)/u + 1;// nr gutui care pot fi culese
qsort(gutuie,n,sizeof(GUTUIE),(void*) relatie); // sortarea vectorului descrescator dupa inaltimi
sol[0]=gutuie[0].g;
//vmin[0].val=gutuie[0].g;
int zona, poz_min;
culese=1;// numarul de gutui culese; initial 1 intrucat in vectorul de solutii se afla deja prima gutuie
for (i=0;i<n;i++)
{zona= (h-gutuie[i].h)/u;
min=sol[0];
for (j=1; j<=zona;j++)
if (sol[j]<min)
{min=sol[j];
poz_min=j;
}
if (min<gutuie[i].g)
sol[poz_min]=gutuie[i].g; }
for (i=0;i<=zona;i++)
suma=suma+sol[i];
fprintf(out,"%ld",suma);
free(vmin);
free(gutuie);
free(sol);
fclose(in);
fclose (out);
return 0;}