Cod sursa(job #596524)

Utilizator stefanzzzStefan Popa stefanzzz Data 17 iunie 2011 17:11:24
Problema Energii Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <fstream.h>
#define MAX 2000000000

int g, w, eg[1001], cg[1001], cmin[5001], emin[5001];
bool uz[5001][1001];

void citire();
void initializare();
void calcul();


main(){
	freopen("energii.in", "r", stdin);
	freopen("energii.out", "w", stdout);
	citire();
	initializare();
	calcul();
	printf("%d", cmin[w]);
}

void citire(){
	int i;
	scanf("%d%d", &g, &w);
	for(i=1;i<=g;i++)
		scanf("%d%d", &eg[i], &cg[i]);}

void initializare(){
	for(int i=1;i<=w;i++)
		cmin[i]=-1;}
void calcul(){
	int mine,jj;
	long minc;
	for(int i=1;i<=w;i++){
		minc=MAX;
		for(int j=1;j<=g;j++){
			if(eg[j]>=i-emin[(i-eg[j]>0)?(i-eg[j]):0]&&uz[(i-eg[j]>0)?(i-eg[j]):0][j]==0&&minc>cmin[(i-eg[j]>0)?(i-eg[j]):0]+cg[j]){
				minc=cmin[(i-eg[j]>0)?(i-eg[j]):0]+cg[j];
				mine=emin[(i-eg[j]>0)?(i-eg[j]):0]+eg[j];
				jj=j;}}
		if(minc!=MAX){
			cmin[i]=minc;
			emin[i]=mine;
			for(int k=1;k<=g;k++){
				if(uz[(i-eg[jj]>0)?(i-eg[jj]):0][k])
					uz[i][k]=1;}
			uz[i][jj]=1;}}}