Cod sursa(job #3284319)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 11 martie 2025 14:20:54
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");

const int nmax = 100;
const int INF  = 1e9;
const int lmax = 100;
int n,l;

int d[nmax + 5][lmax*2 + 5];

int a[nmax + 5];
int b[nmax + 5];

int t[nmax + 5][lmax*2 + 5];

void reset(int val = 0)
{
    for(int i=0; i<=n; i++)
        for(int j=0; j<=l; j++)
            d[i][j]=val;
}

bool good(int tmax)
{
    reset(-INF);
    d[0][0]=0;
    for(int i=1; i<=n; i++)
        for(int xa=0; xa<=l; ++xa)
        {
            int nd = (l-xa)*a[i];

            for(int adda = 0; adda*a[i]<=min(tmax,nd); adda++)
            {
                int use = adda;
                int rmn = (tmax-adda*a[i])/b[i];
                int newa =  min(l,xa+use);
                d[i][newa] = max(d[i][newa],d[i-1][xa] + rmn);
            }
        }
    return d[n][l] >= l;
}
void get_sol(int tmax)
{
    reset(-INF);
    d[0][0]=0;
    for(int i=1; i<=n; i++)
        for(int xa=0; xa<=l; ++xa)
        {
            int nd = (l-xa)*a[i];

            for(int adda = 0; adda*a[i]<=min(tmax,nd); adda++)
            {
                int use = adda;
                int rmn = (tmax-adda*a[i])/b[i];
                int newa =  min(l,xa+use);
                if(d[i-1][xa] + rmn > d[i][newa]){
                    d[i][newa] = d[i-1][xa] + rmn;
                    t[i][newa] = xa;
                }
            }
        }

}

int bs()
{
    int st = 1;
    int dr = 100;
    int bst = 100;
    while(st<=dr)
    {
        int mid = (st+dr)/2;
        if(good(mid))
            bst = mid,dr=mid-1;
        else
            st=mid+1;
    }
    return bst;
}

void afis(int i,int xa)
{
    if(i>0)
    {
        int anta = t[i][xa];
        afis(i-1,anta);
        fout<<(xa-anta)<<' '<<(d[i][xa] - d[i-1][anta])<<'\n';
    }
}


int main()
{
    fin>>n>>l;
    for(int i=1; i<=n; i++)   fin>>a[i]>>b[i];

    int mn_time = bs();
    fout<<mn_time<<'\n';
    get_sol(mn_time);
    afis(n,l);

}