Mai intai trebuie sa te autentifici.
Cod sursa(job #71343)
Utilizator | Data | 10 iulie 2007 11:40:32 | |
---|---|---|---|
Problema | Energii | Scor | 85 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.27 kb |
#include <stdio.h>
int i,j,k,g,w,x,y,a[2000],b[2000],min,st[2000],p,s;
//void init() {st[k]=-1;}
int Am_Succ()
{ if (st[k]<1)
{if ((st[k]==0) && (b[k]>min)) return 0;
st[k]++;
s+=a[k]*st[k];
p+=b[k]*st[k];
return 1;
}
else return 0;
}
void back()
{int as;
k=1;st[k]=-1;
while (k>0)
{do {as=Am_Succ();
}
while (as && (p>min));
if (as) if ((s>=w) || (k==x)) if ((s>=w) && (p<min)) min=p;
else {}
else {k++;st[k]=-1;}
else {s-=a[k]*st[k];
p-=b[k]*st[k];
k--;
}
}
}
int main()
{
FILE *fin,*fout;
fin=fopen("energii.in","r");
fscanf(fin,"%d",&g);
fscanf(fin,"%d",&w);
s=0;
for (i=1;i<=g;i++)
{fscanf(fin,"%d",&x);
fscanf(fin,"%d",&y);
j=1;
s+=x;
while ((j<=i-1) && (a[j]<x)) j++;
for (k=i-1;k>=j;k--)
{a[k+1]=a[k];
b[k+1]=b[k];
}
a[j]=x;
b[j]=y;
}
fclose(fin);
i=1;
while ((i<=g) && (a[i]<w)) i++;
x=i-1;
if (x+1<=g) min=b[x+1];
else min=32000;
for (i=x+1;i<=g;i++)
if (min>b[i]) min=b[i];
if (s>=w){ p=s=0; back();}
//else if (s==w) min=s;
else min=-1;
fout=fopen("energii.out","w");
fprintf(fout,"%d",min);
fclose(fout);
return 0;
}