Cod sursa(job #262468)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 19 februarie 2009 12:56:30
Problema Energii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#include <stdlib.h>
struct generator
{
	int energie,cost;
};
struct generator2
{
	int a, b;
};
generator v[1005];
generator2 m[1005];
int g,w,economie_distrusa;
void read()
{
	int i;
	scanf("%d%d",&g,&w);
	for (i=1; i<=g; i++)
	{
		scanf("%d%d",&v[i].energie,&v[i].cost);
		m[i].a=v[i].energie;
		m[i].b=v[i].cost;
	}
}
int compare(const void *p,const void *q)
{
	generator x=*(generator*)p,y=*(generator*)q;
	if (x.cost<y.cost)
		return -1;
	if (x.cost>y.cost)
		return 1;
	if (x.energie<y.energie)
		return -1;
	if (x.energie>y.energie)
		return 1;
	return 0;
}
int compare2(const void *p,const void *q)
{
	generator2 k=*(generator2*)p,l=*(generator2*)q;
	if (k.a<l.a)
		return -1;
	if (k.a>l.a)
		return 1;
	if (k.b<l.b)
		return -1;
	if (k.b>l.b)
		return 1;
	return 0;
}
void sort()
{
	qsort(v+1,g,sizeof(v[0]),compare);
}
void sort2()
{
	qsort(m+1,g,sizeof(m[0]),compare2);
}
void verif()
{
	int i,s=0;
	for (i=1; i<=g; i++)
		s+=v[i].energie;
	if (s<w)
	{
		printf("-1");
		economie_distrusa=1;
	}
}
void solve()
{
	int costmin=0,energie=0,r,i,costmin2,q,costact,energie2;
	for (i=1; i<=g; i++)
		if (energie<w)
		{
			energie+=v[i].energie;
			costmin+=v[i].cost;
		}
	costmin2=1000000;
	for (i=g; i>=1; i--)
		if (m[i].a<=w)
		{
			q=1;
			energie2=m[i].a;
			costact=m[i].b;
			//printf("%d ",costact);
			while (energie2<w)
			{
				costact+=m[q].b;
				q++;
				energie2+=m[q].a;
				if (q==i)
					break;
			}
			if (costact<costmin2 && energie2>=w)
				costmin2=costact;
		}
	if (costmin>costmin2)
		printf("%d",costmin);
	else
		printf("%d",costmin2);
}
int main()
{
	freopen("energii.in","r",stdin);
	freopen("energii.out","w",stdout);
	read();
	sort();
	sort2();
	verif();
	//afisare();
	if (economie_distrusa==0)
		solve();
	return 0;
}