Cod sursa(job #2237161)

Utilizator JakeGyllenhaalJake Gyllenhaal JakeGyllenhaal Data 31 august 2018 19:22:22
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <fstream>
#include <vector>
#define VAL 105

using namespace std;

ifstream fin("lapte.in");
ofstream fout("lapte.out");

int N, L, i, j, A[VAL], B[VAL];
int SOL1[VAL], SOL2[VAL], dp[VAL][VAL];
int last[VAL][VAL], X, Y, mx, ind;

bool Check(int T)
{
    mx=0;
    for (i=1; i<=N; i++)
    {
        for (j=0; j<VAL; j++)
            dp[i][j]=last[i][j]=-VAL*VAL;
        for (X=0; X<=T; X++)
        {
            if (X*A[i]>T)
                break;
            Y=(T-X*A[i]) / B[i];
            if (i==1)
            {
                if (Y>dp[i][X])
                {
                    dp[i][X]=Y;
                    last[i][X]=0;
                }
            }
            else
            {
                for (j=X; j<VAL; j++)
                {
                    if (dp[i-1][j-X]!=-VAL*VAL)
                    {
                        if (dp[i-1][j-X]+Y>dp[i][j])
                        {
                            last[i][j]=j-X;
                            dp[i][j]=dp[i-1][j-X]+Y;
                        }
                    }
                }
            }
        }
    }
    mx=0;
    for (j=L; j<VAL; j++)
    {
        if (dp[N][j]>mx)
        {
            mx=dp[N][j];
            ind=j;
        }
    }
    if (mx<L)
        return false;
    for (i=N; i>=1; i--)
    {
        SOL1[i]=ind-last[i][ind];
        SOL2[i]=(T-A[i]*SOL1[i]) / B[i];
        ind=last[i][ind];
    }
    return true;
}

int Binary_Search()
{
    int be=1, en=VAL-5;
    int mid, ANS=0;
    while (be<=en)
    {
        mid=(be+en) / 2;
        if (Check(mid)==true)
        {
            ANS=mid;
            en=mid-1;
        }
        else
            be=mid+1;
    }
    return ANS;
}

int main()
{
    fin >> N >> L;
    for (i=1; i<=N; i++)
        fin >> A[i] >> B[i];
    fout << Binary_Search() << '\n';
    for (i=1; i<=N; i++)
        fout << SOL1[i] << " " << SOL2[i] << '\n';
    fin.close();
    fout.close();
    return 0;
}