Cod sursa(job #581993)

Utilizator maritimCristian Lambru maritim Data 14 aprilie 2011 19:35:11
Problema Energii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<stdio.h>

#define INF 200000000

typedef struct
{
	int g;
	int c;
} ruc;

ruc A[10001];
int N;
int W;
long long CMIN = INF;
long int Eg[10001];
long int Cg[10001];

void citire(void)
{
	FILE *f = fopen("energii.in","r");
	
	fscanf(f,"%d %d",&N,&W);
	for(int i=1;i<=N;i++)
		fscanf(f,"%d %d",&A[i].g,&A[i].c);
	
	fclose(f);
}

int poz(int li,int ls)
{
	ruc a = A[(li+ls)/2];
	A[(li+ls)/2] = A[li];
	A[li] = a;
	int c;
	int i1 = 0;
	int j1 = -1;
	while(li<ls)
	{
		if((double)A[li].g/A[li].c<(double)A[ls].g/A[ls].c || 
			((double)A[li].g/A[li].c==(double)A[ls].g/A[ls].c && A[li].c>A[ls].c))
			{
				a = A[li];
				A[li] = A[ls];
				A[ls] = a;
				c = -i1;
				i1 = -j1;
				j1 = c;
			}
		li += i1;
		ls += j1;
	}
	return li;
}

void quicksort(int li,int ls)
{
	if(li<ls)
	{
		int k = poz(li,ls);
		quicksort(li,k-1);
		quicksort(k+1,ls);
	}
}

void solve(void)
{
	long long G = 0;
	for(int i=1;i<=N;i++)
		if(A[i].g >= W && A[i].c < CMIN)
		{
			CMIN = A[i].c;
			Cg[i] = A[i].c;
		}
		else
		{
			if(G<=W)
			{
				if(CMIN == INF)
					CMIN = 0;
				G += A[i].g;
				CMIN += A[i].c;
			}
		}
}

int main()
{
	FILE *g = fopen("energii.out","w");
	
	citire();
	quicksort(1,N);
/*	for(int i=1;i<=N;i++)
		printf("%d %d\n",A[i].g,A[i].c);*/
	solve();
	if(CMIN != INF)
		fprintf(g,"%lld",CMIN);
	else
		fprintf(g,"-1");
	
	fclose(g);
	return 0;
}