Pagini recente » Cod sursa (job #1557298) | Cod sursa (job #1642935) | Cod sursa (job #2379354) | Cod sursa (job #1017928) | Cod sursa (job #896642)
Cod sursa(job #896642)
# include <iostream>
# include <fstream>
using namespace std;
int n, l, a[100000], b[100000], aux[10000][10000], sol=100000, d[10000][10000], s[100000][20];
void citire ()
{
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=1;i<=n;++i)
for(int j=0;j<=l;++j)
aux[i][j]=-1;
for(int i=0;i<=l;++i)
if (i*a[1]<=t)
aux[1][i]=(t-a[1]*i)/b[1];
for(int i=2;i<=n;++i)
for(int j=0;j<=l;++j)
for(int k=0;k*a[i]<=t && k<=j;++k)
if (j-k>=0 && aux[i-1][j-k]>-1 && aux[i][j]<=aux[i-1][j-k]+(t-k*a[i])/b[i])
{
aux[i][j]=aux[i-1][j-k]+(t-k*a[i])/b[i];
d[i][j]=k;
}
if (aux[n][l]>=l)
{
for(int i=n, j=l;i;--i)
{
s[i][0]=d[i][j];
s[i][1]=aux[i][j]-aux[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 afis ()
{
ofstream fout ("lapte.out");
fout<<sol<<endl;
for(int i=1;i<=n;++i)
fout<<s[i][0]<<" "<<s[i][1]<<endl;
}
int main()
{
citire ();
cauta(1, 100);
afis ();
return 0;
}