Cod sursa(job #93826)

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


short int vector[1002],cost[1002],energie[1002],vec[500],ener[500];	//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 combina(int stanga,int dreapta,int pivot)
	{
	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 mergesort(int stanga, int dreapta,int pivot)
	{
	if (stanga == dreapta) return;
		else
		{
		mergesort(stanga,pivot,(stanga+pivot)/2);
		mergesort(pivot+1,dreapta,(pivot+dreapta+1)/2);
		}
	combina(stanga,dreapta,pivot);
	}

void bkt()
	{
   short int k=0;
	vector[k]=-1;
	while (k>-1) 
		{
		if (((G-1)>=vector[k]) && (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;
}