Pagini recente » Cod sursa (job #982174) | Cod sursa (job #1069765) | Cod sursa (job #532726) | Cod sursa (job #1427806) | Cod sursa (job #549725)
Cod sursa(job #549725)
# include <fstream>
# include <iostream>
# define DIM 128
using namespace std;
int n, l, a[DIM], b[DIM], bst[DIM][DIM], sol=DIM, d[DIM][DIM], s[DIM][2];
void read ()
{
ifstream fin ("lapte.in");
fin>>n>>l;
for(int i=1;i<=n;++i)
fin>>a[i]>>b[i];
}
int ok (int t)
{
for(int i=0;i<=n;++i)
for(int j=0;j<=l;++j)
bst[i][j]=-1;
bst[0][0]=0;
for(int i=1;i<=n;++i)
for(int j=0;j<=l;++j)
for(int k=0;k<=l;++k)
{
if (k>j)continue;
if (bst[i-1][j-k]<0)continue;
if (k*a[i]>t)continue;
if (bst[i][j]<bst[i-1][j-k]+(t-k*a[i])/b[i])
{
bst[i][j]=bst[i-1][j-k]+(t-k*a[i])/b[i];
d[i][j]=k;
}
}
if (bst[n][l]>=l)
{
for(int i=n, j=l;i;--i)
{
s[i][0]=d[i][j];
s[i][1]=bst[i][j]-bst[i-1][j-d[i][j]];
j=j-d[i][j];
}
return 1;
}
return 0;
}
void cauta (int st, int dr)
{
if (st==dr)
{
if (st<sol && ok(st))
sol=st;
return;
}
int mij=(st+dr)/2;
if (ok(mij))
{
sol=mij;
cauta (st,mij);
}
else
cauta (mij+1, dr);
}
void write ()
{
ofstream fout ("lapte.out");
fout<<sol<<endl;
for(int i=1;i<=n;++i)
fout<<s[i][0]<<" "<<s[i][1]<<endl;
}
int main()
{
read ();
cauta(1, 100);
write ();
return 0;
}