Pagini recente » Cod sursa (job #2566303) | Cod sursa (job #435209) | Cod sursa (job #212305) | Cod sursa (job #2712180) | Cod sursa (job #440463)
Cod sursa(job #440463)
//Nistor Ruxandra
//321 CA
#include <stdio.h>
#include <stdlib.h>
// se declara structura in care vor fi retinute inaltimea is greutatea unei gutui
typedef struct {
int height;
int weight;
} fruit;
// se defineste o functie compare, ce va fi folosita de qsort ptr ordonare
int compare (const void * a, const void * b)
{
return (((fruit *)b ) ->weight - ((fruit *)a ) ->weight);
}
int main(){
int h, u, hmin;
int n, i;
fruit *x;
//se citesc datele din fisier
FILE *fin = fopen("gutui.in", "r");
fscanf(fin, "%d", &n);
fscanf(fin,"%d", &h);
fscanf(fin, "%d", &u);
//se aloca spatiu pentru vectorul de gutui
x = (fruit *) malloc( n *sizeof(fruit));
hmin = h;
//se citesc
for(i = 0; i < n; i++){
fscanf(fin, "%d %d", &(x[i].height), &(x[i].weight));
//se retine inaltimea minima la care se afla o gutuie
if(x[i].height < hmin)
hmin = x[i].height;
}
fclose(fin);
//se sorteaza vectorul de gutui dupa greutate
qsort(x, n, sizeof(fruit), compare);
//se initializeaza greutatea la 0
int greutate = 0;
//se declara un vector de momente de timp, care inidica daca la momentul respectiv s-a luat ceva
char *cules;
int moment;
cules = (char * ) calloc ((( h - hmin) / u + 2), sizeof (char));
for (i = 0; i < n; i++){
//daca gutuia este inca accesibila
if(h >= x[i].height){
//se retine momentul maxim la care se poate lua
moment = (h - x[i].height) / u;
//daca nu se poate lua atunci, se cauta daca se mai poate lua (daca exista vr-un mom anterior la care nu sa luat nimic)
while(moment >= 0 && cules[moment] != 0){
moment --;
}
//daca s-a gasit un moment in care se poate lua gutuia
if(moment >= 0){
// se culege gutuia
cules[moment] = 1;
greutate += x[i].weight;
}
}
}
//se elibereaza memoria
free(cules);
free(x);
//se scrie rezultatul in fisier
FILE *fout = fopen("gutui.out", "w");
fprintf(fout, "%d\n", greutate);
fclose(fout);
return 0;
}