Cod sursa(job #440463)

Utilizator rurryRuxandra Nistor rurry Data 12 aprilie 2010 01:44:29
Problema Gutui Scor 100
Compilator c Status done
Runda teme_upb Marime 1.89 kb
//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;
}