Cod sursa(job #93850)

Utilizator Ady.hAdrian Hada Ady.h Data 20 octombrie 2007 14:24:55
Problema Energii Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <stdio.h>
#include <stdlib.h>


short int vector[1001],cost[1001],energie[1002],vec[501],ener[501];	//vector se foloseste pentru generarea de solutii
short int G;	//numarul de generatoare
short int W;	//cantitatea de energie necesara repornirii centralei
int cost_minim=11000000,cost_curent=0,putere_curenta=0;

void mergesort(int stanga, int dreapta,int pivot)
	{
	if (stanga != dreapta)
		{
		mergesort(stanga,pivot,(stanga+pivot)/2);
		mergesort(pivot+1,dreapta,(pivot+dreapta+1)/2);
		}
		register int i=0;
		register int j=stanga;
		register int k=stanga;
		while (j<=pivot)
			{
			vec[i]=cost[j];
			ener[i++]=energie[j++];
			}
		i=0;
		while (k<j && j<=dreapta)
			if (cost[j]<vec[i])
				{
				cost[k]=cost[j];
				energie[k++]=energie[j++];
				}
			else 
				{
				cost[k]=vec[i];
				energie[k++]=ener[i++];
				};
		while (k<j)
			{
			cost[k]=vec[i];
			energie[k++]=ener[i++];		
			}
	}

void bkt()
	{
   	register short int k=0;
	vector[k]=-1;
	while (k>-1) 
		{
		if ((vector[k] < G-1) && (cost_curent < cost_minim))
			{
		  	vector[k]++;
			cost_curent=cost_curent-cost[vector[k]-1]+cost[vector[k]];
			putere_curenta=putere_curenta-energie[vector[k]-1]+energie[vector[k]];
			if (cost_curent < cost_minim) 
				{
				if (putere_curenta >= W)
            				{
              				 //tipar(k);
   					cost_minim=cost_curent;
               				cost_curent-=cost[vector[k]];
            				putere_curenta-=energie[vector[k]];
            				k--;
              			 	}
				  	else
					 	{
					  	k++;
						vector[k]=vector[k-1];
					  	cost_curent+=cost[vector[k]];
					  	putere_curenta+=energie[vector[k]];
						}
				}
			
			}
		else
      		{
            cost_curent-=cost[vector[k]];
            putere_curenta-=energie[vector[k]];
            k--;
            }
			 
		}
	}

int main()
{
FILE *in;
in=fopen("energii.in","r");
fscanf(in,"%hd",&G);
fscanf(in,"%hd",&W);
int i=0;

//printf("%d %d",G,W);
for (;i<G;i++)
	{
	fscanf(in,"%hd %hd",&energie[i],&cost[i]);
   //printf("%d %d ",energie[i],cost[i]);
	}
  // printf("\n");
fclose(in);

mergesort(0,G-1,G/2);

bkt();

in=fopen("energii.out","w");
if (cost_minim == 11000000) fprintf(in,"%d",-1);
	else fprintf(in,"%d",cost_minim);

//inchiderea fisierelor si incheierea executiei
fclose(in);
return 0;
}