Cod sursa(job #470300)

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

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

#define INF 10000000

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;
	long long int cost = 0;
	i = 0;
	int start = 0;
	long long int bestCost = INF;
	while( start < g ){
		cost = 0;
		sumE = 0;
		i = start;
		while( sumE < w && i < g ){
			sumE += ergVect[i].eg;
			cost += ergVect[i].cg;
			i++;
		}
		start++;
		if( bestCost > cost && sumE >= w){
			bestCost = cost;
		}
	}
	
	fprintf(fout,"%lld",bestCost);
	fclose(fin);
	fclose(fout);
	
	return 0;
}