Cod sursa(job #1368195)

Utilizator acomAndrei Comaneci acom Data 2 martie 2015 15:05:10
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<fstream>
#include<cstring>
#include<iomanip>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,l,st,dr,mij,A[105],B[105],CA[105],CB[105];
int poz,D[105][10005],P[105][10005];
void lapte(int T)
{
    int i,j,k,x=0,Max=0,s=0,a=0,b=0;
    for (i=1;i<=n;++i)
    {
        b+=T/A[i];
        for (j=0;j<=b;++j)
        {
            for (k=max(0,j+a-b);k<=a && k<=j;++k)
            {
                x=D[i-1][k]+(T-(j-k)*A[i])/B[i];
                if (D[i][j]<=x)
                    D[i][j]=x, P[i][j]=k;
            }
        }
        a=b;
    }
    for (i=l;i<=b;++i)
        if (D[n][poz]<=D[n][i])
            poz=i;
}
void reprsol(int i, int j)
{
    if (i==1)
    {
        fout<<j<<" "<<D[i][j]<<"\n";
        return ;
    }
    int k=P[i][j];
    reprsol(i-1,k);
    fout<<j-k<<" "<<D[i][j]-D[i-1][k]<<"\n";
}
int main()
{
    int i;
    fin>>n>>l;
    for (i=1;i<=n;++i)
        fin>>A[i]>>B[i];
    st=1, dr=100;
    while (st<=dr)
    {
        mij=(st+dr)>>1;
        poz=l;
        lapte(mij);
        if (D[n][poz]>=l)
            dr=mij-1;
        else
            st=mij+1;
        memset(D,0,sizeof(D));
    }
    fout<<st<<"\n";
    lapte(st);
    reprsol(n,poz);
    return 0;
}