Cod sursa(job #896682)

Utilizator ArynorBoghean Adrian Arynor Data 27 februarie 2013 16:46:14
Problema Lapte Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
# include <iostream>
# include <fstream>


using namespace std;
int n, l, a[100000], b[100000], aux[10000][10000], sol=100000, d[10000][10000], s[10000][10000];

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, 100000);
    afis ();
    return 0;
}