Pagini recente » Cod sursa (job #1381319) | Cod sursa (job #225522) | Cod sursa (job #1236502) | Cod sursa (job #1423279) | Cod sursa (job #93841)
Cod sursa(job #93841)
#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-1,(stanga+pivot-1)/2);
mergesort(pivot,dreapta,(pivot+dreapta)/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()
{
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;
}