Cod sursa(job #390402)

Utilizator freak93Adrian Budau freak93 Data 3 februarie 2010 18:22:08
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<fstream>

using namespace std;

const char iname[]="lapte.in";
const char oname[]="lapte.out";
const int maxn=105;

ifstream f(iname);
ofstream g(oname);

int n,i,j,a[maxn],b[maxn],l,step,dp[maxn][maxn],drinka[maxn][maxn],drinkb[maxn][maxn],da,db,k;
int fda[maxn],fdb[maxn];

int net(int t)
{
    int i,k;
    for(i=1;i<=n;++i)
    {
        for(j=0;j<=l;++j)
            dp[i][j]=dp[i-1][j],drinka[i][j]=0,drinkb[i][j]=0;
        for(da=0;;++da)
        {
            if(da*a[i]>t)
                break;
            db=t-da*a[i];
            db/=b[i];
            for(k=0;;++k)
            {
                if(k+da>l||dp[i-1][k]==-1)
                    break;
                if(dp[i][k+da]>=dp[i-1][k]+db)
                    continue;
                dp[i][k+da]=dp[i-1][k]+db;
                drinka[i][k+da]=da;
                drinkb[i][k+da]=db;
            }
            if(dp[i][l]>=l)
                return i;
        }
    }

    return 0;
}

int main()
{
    f>>n>>l;
    for(i=1;i<=n;++i)
        f>>a[i]>>b[i];
    for(i=1;i<=l;++i)
        dp[0][i]=-1;
    for(step=1;step<maxn;step<<=1);
    for(i=0;step;step>>=1)
        if(i+step<maxn&&net(i+step)==0)
            i+=step;

    k=net(++i);
    g<<i<<"\n";
    for(i=k,j=l;i;--i)
    {
        fda[i]=drinka[i][j];
        fdb[i]=drinkb[i][j];
        j-=fda[i];
    }
    for(i=1;i<=n;++i)
        g<<fda[i]<<" "<<fdb[i]<<"\n";

    f.close();
    g.close();

    return 0;
}