Cod sursa(job #1754219)

Utilizator Bodo171Bogdan Pop Bodo171 Data 7 septembrie 2016 18:00:55
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
vector< pair<int,int> > ans;
int best[105][105],i,j,n,a[105],b[105],x,p,u,m,l,q,k,tt[105][105],lin,col;
bool ok,pos[105][105];
bool check()
{
    x=m;
    for(i=0;i<=n;i++)
     for(j=0;j<=l;j++)
        best[i][j]=0,pos[i][j]=0;
    pos[0][0]=1;
    for(i=1;i<=n;i++)
        for(j=0;j<=x/a[i];j++)
        {
            q=(x-(j*a[i]))/b[i];
            for(k=0;k<=l-j;k++)
            {
              if(pos[i-1][k])
               {
                   pos[i][k+j]=1;if(best[i][k+j]==0) tt[i][k+j]=k;
               if(best[i-1][k]+q>best[i][k+j])
                {best[i][k+j]=best[i-1][k]+q;tt[i][k+j]=k;}
               }
            }
        }
    return (best[n][l]>=l);
}
int main()
{
    ifstream f("lapte.in");
    ofstream g("lapte.out");
    f>>n>>l;
    for(i=1;i<=n;i++)
    {
        f>>a[i]>>b[i];
    }
    p=1;u=100;
    while(u-p>1)
    {
        m=(p+u)/2;
        if(check()) u=m;
        else p=m;
    }
    m=u-1;
    ok=check();
    if(ok==1) {u--;}
    else {m++;ok=check();}
    g<<u<<'\n';lin=n;col=l;
    while(lin!=0)
    {
        ans.push_back(make_pair(col-tt[lin][col],best[lin][col]-best[lin-1][tt[lin][col]]));
        col=tt[lin][col];lin--;
    }
    for(i=ans.size()-1;i>=0;i--)
    {
        g<<ans[i].first<<' '<<ans[i].second<<'\n';
    }
    return 0;
}