Pagini recente » Cod sursa (job #1787656) | Cod sursa (job #300858) | Cod sursa (job #2792692) | Cod sursa (job #915640) | Cod sursa (job #443053)
Cod sursa(job #443053)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct structura
{
long w;//greutate
long h;//inaltime
long mark;
long cules;
} gutuie;
int Compara(const void* a, const void* b)//crescator dupa inaltime,altfel descrescator dupa greutate
{
if (((gutuie*)a)->h == ((gutuie*)b)->h) return (((gutuie*)b)->w - ((gutuie*)a)->w);
else return (((gutuie*)a)->h - ((gutuie*)b)->h);
}
int Compara2(const void* a, const void* b)//descrescator dupa greutate
{
return (((gutuie*)b)->w - ((gutuie*)a)->w);
}
int main()
{
long n, ho,u;//numar de gutui,inaltime maxima,pas de crestere a inaltimii
long i,j,count=0,suma=0,stop=0,liber;
FILE *f,*g;
f = fopen("gutui.in", "rt");
g = fopen("gutui.out", "w");
if ((!f) ||(!g))
{ printf("Eroare deschidere fisiere\n");
return -1;
}
fscanf(f, "%ld %ld %ld", &n,&ho,&u);//se citesc: numar de gutui,inaltime maxima,pas de crestere a inaltimii
gutuie gutui[n];//vector de gutui
//se citesc inaltimea si greutatea gutuilor si se introduc in vectorul de gutui
for (i=0;i<n;i++)
{
fscanf(f, "%ld %ld", &gutui[i].h,&gutui[i].w);
gutui[i].cules=0;
gutui[i].mark=0;
}
fclose(f);
qsort(gutui,n,sizeof(gutuie),Compara);//sortare crescatoare dupa inaltime
long top;
long offset = ho % u;
if (offset == u) top = 0;
else top = offset - u;
gutuie vector[n];
//se construieste un vector de gutui de n elemente, cu structuri de tip gutuie care au initializate toate campurile cu 0
for (i=0;i<n;i++)
{
vector[i].w=0;
vector[i].h=0;
vector[i].mark=0;
vector[i].cules=0;
}
while (top <= ho)
{
liber=0;
for (i=0;i<n;i++)
{
if (gutui[i].h>top) break;//daca se depaseste nivelul curent
if (gutui[i].mark!=1)//daca nu a fost introdusa anterior in vector
{
vector[count].w=gutui[i].w;//introduc in vectorul de gutui construit pana la momentul respectiv
vector[count].h=gutui[i].h;
gutui[i].mark=1;//se marcheaza faptul ca s-a introdus gutuia in vector
count++;//se incrementeaza numarul de gutui introduse in vector
liber=1;
}
}
//daca s-au introdus noi gutui in vector sau daca s-au introdus toate gutuile dar top nu a ajuns inca la inaltimea maxima
if ((liber==1)||(count==n))
{
qsort(vector,n,sizeof(gutuie),Compara2);//sortez vectorul descrescator dupa greutate
for (j=0;j<n;j++)//caut in vector cel mai greu fruct necules
{
if (vector[j].cules != 1)//daca nu a fost cules
{
suma+=vector[j].w;//adaug la suma primul element necules(vectorul este sortat dupa greutate)
vector[j].cules=1;//se marcheaza ca fiind cules
break;
}
}
}
top+=u;//se trece la nivelul urmator
}
fprintf(g,"%ld\n",suma);
fclose(g);
return 0;
}