Cod sursa(job #2755621)

Utilizator octavi26octavian octavi26 Data 27 mai 2021 20:01:20
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <bits/stdc++.h>
#define N 108

using namespace std;

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

int n, L;
int T;
int vA[N], vB[N];
pair<int, int> Lapte[N][N];
pair<int, int> A[N][N];

void Citire()
{
    int i;
    fin >> n >> L;
    for( i=1; i<=n; i++ )
        fin >> vA[i] >> vB[i];
}

int DP[N][N];
/// dp[i][j] = maximul de lapte B din care am baut pana acum j litri de lapte A intre primele i persoane

bool Verif( int t )
{
    int i, j;
    int x, y;
    for( i=0; i<=n; i++ )
        for( j=0; j<=L; j++ )
            DP[i][j] = -2e9;
	DP[0][0] = 0;

    for( i=1; i<=n; i++ )
        for( j=0; j<=L; j++ )
            for( x=0; x<=j; x++ )
                if( x * vA[i] <= t )
                {
                    y = (t - x * vA[i]) / vB[i];
                    if( DP[i - 1][j - x] + y > DP[i][j] )
                    {
                        DP[i][j] = DP[i - 1][j - x] + y;
                        A[i][j] = { x, y };
                    }
                }

    /*
    if( t == 18 )
    {
        for( i=1; i<=n; i++, cout << "\n" )
            for( j=0; j<=L; j++ )
                cout << DP[i][j] << " ";

        cout << "\n\n";
    }
    */

    return DP[n][L] >= L;
}

void Transfer( pair<int, int> A[][N], pair<int, int>B[][N] )
{
    int i, j;
    for( i=1; i<=n; i++ )
        for( j=0; j<=L; j++ )
            A[i][j].first = B[i][j].first,
            A[i][j].second = B[i][j].second;
}

int CB( int st, int dr )
{
    int mid;
    int t = 100;
    while( st <= dr )
    {
        mid = ( st + dr ) / 2;
        if( Verif( mid ) )
        {
            t = mid;
            dr = mid - 1;
            Transfer( Lapte, A );
        }
        else{
            st = mid + 1;
        }
    }
    return t;
}

stack<pair<int, int>> sol;

int Rezolvare()
{
    int i, j;
    T = CB( 1, 100 );
    fout << T << "\n";

    /*
    for( i=1; i<=n; i++, cout << "\n\n" )
        for( j=0; j<=L; j++ )
            cout << Lapte[i][j].first << " " << Lapte[i][j].second << "\t";
    */

    i = n; j = L;
    for( int k = 1; k <= n; k++ )
    {
        sol.push( Lapte[i][j] );
        j -= Lapte[i][j].first;
        i--;
    }
    while( !sol.empty() )
    {
        fout << sol.top().first << " " << sol.top().second << "\n";
        sol.pop();
    }
}

int main()
{
    Citire();
    Rezolvare();
    fin.close();
    fout.close();
    return 0;
}