Cod sursa(job #2647369)

Utilizator stefanvoicaVoica Stefan stefanvoica Data 4 septembrie 2020 09:35:34
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");
int n,l,dp[102][102],costla[102],costlb[102],afis[102][2];

bool sol (int timp)
{
    int i,latotal,la,lb;
    for (i=1; i<=n; i++)
        for (latotal=0; latotal<=l; latotal++)
            dp[i][latotal]=-1;
    dp[0][0]=0;
    if (timp==25)
        ++timp,--timp;
    for (i=1; i<=n; i++)
        for (latotal=0; latotal<=l; latotal++)
            if (dp[i-1][latotal]!=-1)
            {
                for (la=0; la<=min(l,timp/costla[i]); la++)
                    if (latotal>=la)
                {
                    lb=(timp-costla[i]*la)/costlb[i];
                    dp[i][latotal]=max(dp[i][latotal],dp[i-1][latotal-la]+lb);
                }
            }
    if (dp[n][l]>=l)
        return 1;
    return 0;
}

void reconstituie (int t)
{
    sol (t);
    int i=n,la,latotal=l;
    while (i>0)
    {
        for (la=0;la<=l;la++)
            if (dp[i][latotal]!=dp[i-1][latotal-la])
        {
            afis[i][0]=la;
            afis[i][1]=dp[i][latotal]-dp[i-1][latotal-la];
            i--;
            latotal-=la;
            break;
        }
    }
    for (i=1;i<=n;i++)
        fout<<afis[i][0]<<' '<<afis[i][1]<<'\n';
}

int main()
{
    fin>>n>>l;
    int st=1,dr=100,last=0,i;
    for (i=1; i<=n; ++i)
        fin>>costla[i]>>costlb[i];
    while (st<=dr)
    {
        int mij=(st+dr)/2;
        if (sol (mij))
        {
            last=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    fout<<last<<'\n';
    reconstituie(last);
    return 0;
}