Cod sursa(job #444160)

Utilizator DaninetDani Biro Daninet Data 19 aprilie 2010 16:55:07
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <cstdio>

int a[2][30000];

void make_empty(bool currentline,int max) {
	for (int i=0;i<=max;i++) {
		a[currentline][i] = 0;
	}
}

int main() {
	FILE *ff,*gg;
	ff = fopen("energii.in","r");
	gg = fopen("energii.out","w");
	int g, w;
	fscanf(ff,"%d\n%d\n",&g,&w);
	int e,c;
	bool currentline=1;
	fscanf(ff,"%d %d\n", &e, &c);
	a[0][e] = c;
	for (int i=1; i<g; ++i) {
		fscanf(ff,"%d %d\n", &e, &c);
		//berakja az elotte levo elemeket
		for (int j=1; j<e; j++) {
			a[currentline][j] = a[!currentline][j];
		}
		if (a[!currentline][e]>c || a[!currentline][e]==0) a[currentline][e]=c; else a[currentline][e] = a[!currentline][e];
		//az elemtol kezdodoen
		for (long j=e+1; j<=w+5001; j++){
			/*if (a[!currentline][j-e]==0)
 				if (c<a[!currentline][j]) a[currentline][j] = c; else a[currentline][j] = a[!currentline][j];
			if (a[currentline][j]>a[!currentline][j-e]+c) a[currentline][j]=a[!currentline][j-e]+c;
		*/
			/*if (a[!currentline][j]>0 && a[!currentline][j-e]+c<a[!currentline][j]) a[currentline][j] = a[!currentline][j-e]+c;
			//else if (a[!currentline][j]>0) a[currentline][j] = a[!currentline][j];
			else if (a[!currentline][j-e]==0) a[currentline][j] = a[!currentline][j];
		*/
			if (a[!currentline][j]>0 && a[!currentline][j-e]>0 && a[!currentline][j-e]+c<a[!currentline][j])
				a[currentline][j] = a[!currentline][j-e]+c;
			else if (a[!currentline][j]>0 && a[!currentline][j-e]>0 && a[!currentline][j-e]+c>a[!currentline][j])
				a[currentline][j] = a[!currentline][j];
			else if (a[!currentline][j]==0 && a[!currentline][j-e]>0) 
				a[currentline][j] = a[!currentline][j-e]+c;
			else if (a[!currentline][j]>0 && a[!currentline][j-e]==0) 
				a[currentline][j] = a[!currentline][j];
		}
		currentline = !currentline;
		make_empty(currentline,w*w);
	}
	int min=32000;
	for (long i=w; i<=w+5001; ++i) {
		if (a[!currentline][i]!=0 && a[!currentline][i]<min) min=a[!currentline][i]; 
	}
	if (min == 32000) {
		fprintf(gg,"-1");
	} else {
		fprintf(gg,"%d",min);
	}
	fclose(ff);
	fclose(gg);
	return 0;
}