Cod sursa(job #2865847)

Utilizator AswVwsACamburu Luca AswVwsA Data 9 martie 2022 11:09:48
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <fstream>
#include <cstring>
#include <climits>
using namespace std;
const int NMAX = 103, BIG = 3003, INF = 1000000;
int a[NMAX], b[NMAX], n, l;
int dp[NMAX][NMAX], recon[NMAX][NMAX], last[NMAX][NMAX];

ifstream cin("lapte.in");
ofstream cout("lapte.out");

bool ok(int val)
{
    //dp[i][j] = nr. max. de litri de lapte b bauti de i bautori cand ei beau impreuna j litri a
    //recon[i][j] = cati litri de lapte a bea al i-lea bautor cand, impreuna, primii i bautori beau j litri a
    for (int i = 1; i <= l; i++)
        dp[0][i] = -INF;
    for (int i = 1; i <= n; i++)
        for (int j = 0; j <= l; j++)
        {
            dp[i][j] = dp[i - 1][j] + val / b[i];
            recon[i][j] = 0;
            for (int k = j - 1; k >= 0; k--)
            {
                int need = (val - (j - k) * a[i]) / b[i];
                if (val - (j - k) * a[i] < 0)
                    break;
                //dp[i][j] = dp[i - 1][k] +
                if (dp[i][j] < dp[i - 1][k] + need)
                {
                    dp[i][j] = dp[i - 1][k] + need;
                    recon[i][j] = j - k;
                }
            }
        }
    return dp[n][l] >= l;
}

pair <int, int> vec[NMAX];
int main()
{
    /*cout << (sizeof(last)+sizeof(dp)+sizeof(dplast)+sizeof(a)+sizeof(b))/1024.0;
    return 0;*/
    int i;
    cin >> n >> l;
    for (i = 1; i <= n; i++)
    {
        cin >> a[i] >> b[i];
    }
    /*cout << ok(16);
    return 0;*/
    int st = 1, dr = BIG, med, sol = -1;
    while (st <= dr)
    {
        med = ((st + dr) >> 1);
        if (ok(med))
        {
            sol = med;
            dr = med - 1;
            memcpy(last, recon, sizeof(recon));
        }
        else
            st = med + 1;
        memset(dp, 0, sizeof(dp));
        memset(recon, 0, sizeof(recon));
    }
    //recon[i][j] = cati litri de lapte a bea al i-lea bautor cand, impreuna, primii i bautori beau j litri a
    cout << sol <<"\n";
    int val = l;
    /*for (i = 1; i <= n; i++)
        cout << last[n][l] << " " << (sol - a[i] * last[n][l]) / b[i] << "\n";*/
    for (i = n; i >= 1; i--)
    {
        vec[i] =  {last[i][val], (sol - a[i] * last[i][val]) / b[i]};
        val -= last[i][val];
    }
    for (i = 1; i <= n; i++)
        cout << vec[i].first << " " << vec[i].second << "\n";
}