Cod sursa(job #381645)

Utilizator shnakoVlad Schnakovszki shnako Data 11 ianuarie 2010 12:00:13
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <stdio.h>
#include <stdlib.h>
#define MARE 5898487
FILE *f=fopen("energii.in", "r"), *g=fopen("energii.out", "w");
long sum[10011000], e[1005], c[1005], i, gen, need, j, s, inj, sw;

void shellsort(void)
{
	inj=gen;
	while(inj>1)
	{
		inj/=2;
		do{
			sw=0;
			for( i=1;i<=gen-inj;i++)
				if(sum[i]>sum[i+inj])
				{
					sum[i]=sum[i]^sum[i+inj];
					sum[i+inj]=sum[i]^sum[i+inj];
					sum[i]=sum[i]^sum[i+inj];
					sw++;
				}
		}while(sw!=0);
	}
}	

void citeste(void)
{
	fscanf(f, "%ld%ld", &gen, &need);
	for (i=1;i<=gen;i++)
		fscanf(f, "%ld%ld", &e[i], &c[i]);
	fclose(f);
}

void sume(void)
{
	shellsort();
	for (i=1;i<=gen;i++)
		s+=e[i];
	if (s<need)
	{
		fprintf(g, "-1");
		exit(0);
	}
	for (i=1;i<=s;i++)
		sum[i]=MARE;
	s=0;
	for (i=1;i<=gen;i++)
	{
		for (j=need;j>=0;j--)
			if (sum[j]!=MARE&&c[i]+sum[j]<sum[e[i]+j])
				sum[e[i]+j]=sum[j]+c[i];
		if (sum[e[i]]>c[i])
			sum[e[i]]=c[i];
		s+=e[i];
	}
}

void gaseste(void)
{
	long min=MARE;
	for (i=need;i<=s;i++)
		if (sum[i]<min)
			min=sum[i];
	fprintf(g, "%ld", min);
	fclose(g);
}		
		
int main(void)
{
	citeste();
	sume();
	gaseste();
}