Cod sursa(job #470298)

Utilizator LP337Lazar Pavel LP337 Data 12 iulie 2010 22:39:40
Problema Energii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
/**
*
*	Source: Infoarena
*	Title:	Energii
*	Author: Lazar Pavel
*
**/

#include <stdio.h>
#include <stdlib.h>

struct ENRG{
	int eg;																		// eg - vector cu valoarea energiilor ale generatoarelor
	int cg;																		// cg - costul repornirii generatorului
	double fract;
};

void sort( ENRG *vector, int dim ){
	int found = 1;
	ENRG tmp;
	int i;
	
	while( found ){
		found = 0;
		for( i = 0; i < dim - 1; i++ ){
			if( vector[i].fract > vector[i+1].fract ){
				tmp = vector[i];
				vector[i] = vector[i+1];
				vector[i+1] = tmp;
				found = 1;
			}
		}
	}
}

void printStruct( ENRG *vect, int dim ){
	int i;
	
	for( i = 0; i < dim; i++ ){
		printf("%d %d %.3f\n", vect[i].eg, vect[i].cg, vect[i].fract );
	}
}

int main(){

	FILE *fin = 	fopen("energii.in","r");
	FILE *fout =	fopen("energii.out","w");
	
	int g;																		// g - numarul de generatoare
	int w;																		// w - cantitatea de energie necesara repornirii statiei
	
	fscanf(fin,"%d",&g);
	fscanf(fin,"%d",&w);
	
	ENRG *ergVect = (ENRG*)malloc(g*sizeof(ENRG));
	int i;
	
	for( i = 0; i < g; i++ ){
		fscanf(fin,"%d",&ergVect[i].eg);
		fscanf(fin,"%d",&ergVect[i].cg);
		ergVect[i].fract = (double)(ergVect[i].cg/(double)ergVect[i].eg);
	}

	sort(ergVect,g);
	//printStruct(ergVect,g);
	
	int sumE = 0;
	int cost = 0;
	i = 0;
	
	while( sumE < w ){
		sumE += ergVect[i].eg;
		cost += ergVect[i].cg;
		i++;
	}
	
	fprintf(fout,"%d",cost);
	fclose(fin);
	fclose(fout);
	
	return 0;
}