Cod sursa(job #1477131)

Utilizator BodStfBodoarca Stefan BodStf Data 25 august 2015 15:46:46
Problema Energii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>
#include<malloc.h>

int g,w;
struct ob
{
	int c,e;
};
ob a[1001];

void merge(ob *v,int l,int m,int r)
{
	ob *vp=(ob*)malloc((r-l+1)*sizeof(ob));//vetor intermediar
	int i=l,j=m+1,k=0,s=0;

	while(i<=m && j<=r)
	{
		if(v[i].c<=v[j].c)
		{
			vp[k].c=v[i].c;
			vp[k].e=v[i].e;
			i++;
		}
		else
		{
			vp[k].c=v[j].c;
			vp[k].e=v[j].e;
			j++;
		}
		k++;
	}

	if(i>m)
		for(s=j;s<=r;s++)
		{
			vp[k].c=v[s].c;
			vp[k].e=v[s].e;
			k++;
		}
	else
		for(s=i;s<=m;s++)
		{
			vp[k].c=v[s].c;
			vp[k].e=v[s].e;
			k++;
		}

	for(s=0;s<=r-l;s++)
	{
		v[l+s].c=vp[s].c;
		v[l+s].e=vp[s].e;
	}

	free(vp);
}

void mergesort(ob *v,int l,int r)
{
	if(l==r) return;
	int m=(l+r)/2;
	mergesort(v,l,m);
	mergesort(v,m+1,r);
	merge(v,l,m,r);
}


int main()
{
	FILE* f1,*f2;
	f1=fopen("energii.in","r");
	f2=fopen("energii.out","w");
	fscanf(f1,"%d %d",&g,&w);
	for(int i=0;i<g;i++)
		fscanf(f1,"%d %d",&a[i].e,&a[i].c);
	int sum=0,C=0,ok=0;
	mergesort(a,0,g-1);
	for(int i=0;i<g;i++)
	{
		if(a[i].e>=w)
		{
			fprintf(f2,"%d",a[i].c);
			ok=1;
			break;
		}

		sum+=a[i].e;
		C+=a[i].c;

		if(sum>=w)
		{
			fprintf(f2,"%d",C);
			ok=1;
			break;
		}
	}
	if(!ok)
		fprintf(f2,"-1");
	return 0;
}