Pagini recente » Cod sursa (job #2812673) | Cod sursa (job #2936295) | Cod sursa (job #571582) | Cod sursa (job #567390) | Cod sursa (job #463281)
Cod sursa(job #463281)
//Catalina Nita
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int *sol;
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;
int nivel, poz_min,min;
FILE *in, *out;
in=fopen ("gutui.in", "r");
out=fopen ("gutui.out","w");
/*
citire date si alocare memorie;
*/
fscanf (in,"%u",&n);
gutuie =(GUTUIE*) calloc (n,sizeof (GUTUIE));
/*vector de solutii
*/
sol=(int *) calloc(n,sizeof(int));
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);}
// sortarea vectorului descrescator dupa inaltimi
qsort(gutuie,n,sizeof(GUTUIE),(void*) relatie);
/*
nivelul reprezinta numarul de urcari la care poate fi supusa gutuia de pe o anumita pozitie
poz_min reprezinta pozitia pe care se afla minimul
Se construieste vectorul de solutii prin introducere gutuilor in ordine crescatoare dupa nivel (cele ce pot fi culese primele)
iar in cazul in care poat fi introdusa o varianta de greutate mai buna, se va inlocui minimul greutatilor deja existente cu greutatea gasita;
Gasirea minimului se determina prin parcurgerea vectorului de solutii in mod progresiv de la stanga la dreapta pana la un anumit nivel;
In cazul in care minimul este 0 inseamna ca exista loc pentru aceea gutuie. Altfel, ea se va inlocui sau nu cu o varianta mai buna.
*/
for (i=0;i<n;i++) // n operatii
{nivel= (h-gutuie[i].h)/u;
/*
se seteaza minimul si pozitia sa la inceputul vectorului
*/
min=sol[0];
poz_min=0;
/*
parcurgerea vectorului pana la nivelul corespunzator
*/
for (j=0; j<=nivel;j++) //nr_sol operatii
//gasire minim
if (sol[j]<min)
{min=sol[j];
poz_min=j;
}
if (min<gutuie[i].g)
//inlocuire
sol[poz_min]=gutuie[i].g; }
for (i=0;i<=nivel;i++)
//calcul suma
suma=suma+sol[i];
fprintf(out,"%ld",suma);
free(gutuie);
free(sol);
fclose(in);
fclose (out);
return 0;}