Cod sursa(job #1313590)

Utilizator savigunFeleaga Dragos-George savigun Data 10 ianuarie 2015 21:05:08
Problema Energii Scor 45
Compilator c Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<stdio.h>
#include<stdlib.h>

typedef struct
{
	float cost,pow;
	float ef;
}generator;

int main()
{
	int g,e,i,j,p1=0,p2=0,c1=0,c2=0,q=-1,k=0;
	generator *gen,aux;
	FILE *f,*f2;
	if((f=fopen("energii.in","rt"))==NULL)
		return -1;
	if((f2=fopen("energii.out","wt"))==NULL)
		return -1;
	fscanf(f,"%d %d",&g,&e);
	gen=(generator*)calloc(g,sizeof(generator));
	for(i=0;i<g;i++)
		fscanf(f,"%f %f",&gen[i].pow,&gen[i].cost);
	for(i=0;i<g;i++)
		gen[i].ef=(float)gen[i].cost/(float)gen[i].pow;
	for(i=0;i<g;i++)
		for(j=i+1;j<g;j++)
			if(gen[i].ef>gen[j].ef)
				{
					aux=gen[i];
					gen[i]=gen[j];
					gen[j]=aux;
				}




	for(i=0;i<g;i++)
		for(j=i+1;j<g;j++)
			if(gen[i].ef==gen[j].ef)
				if(gen[i].pow<gen[j].pow)
					{
						aux=gen[i];
						gen[i]=gen[j];
						gen[j]=aux;
					}
	for(i=0;i<g;i++)
		if(e>p1)
			{
				k++;
				p1=p1+gen[i].pow;
				c1=c1+gen[i].cost;
			}
		else
			break;
	if(p1>e)for(i=k-1;i>=0;i--)
		if(p1-gen[i].pow>=e)
			{
				p1=p1-gen[i].pow;
				c1=c1-gen[i].cost;
			}
		else
			break;
	k=0;
	for(i=0;i<g;i++)
		for(j=i+1;j<g;j++)
			if(gen[i].ef==gen[j].ef)
				if(gen[i].pow>gen[j].pow)
					{
						aux=gen[i];
						gen[i]=gen[j];
						gen[j]=aux;
					}
	for(i=0;i<g;i++)
		if(e>p2)
			{
				k++;
				p2=p2+gen[i].pow;
				c2=c2+gen[i].cost;
			}
		else
			break;
	if(p2>e)for(i=k-1;i>=0;i--)
		if(p2-gen[i].pow>=e)
			{
				p2=p2-gen[i].pow;
				c2=c2-gen[i].cost;
			}
		else
			break;
	if(c1>c2 && p2>=e)
		{c1=c2;p1=p2;}
	if(e>p1)
		fprintf(f2,"%d",q);
	else
		fprintf(f2,"%d",c1);
	free(gen);
	fclose(f);
	fclose(f2);
	return 0;
}