Cod sursa(job #2865525)

Utilizator AswVwsACamburu Luca AswVwsA Data 8 martie 2022 21:36:37
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <fstream>
#include <cstring>
using namespace std;
const int NMAX = 103, BIG = 3003;
int a[NMAX], b[NMAX], n, l;
int last[BIG][NMAX], dp[BIG][NMAX], dplast[BIG][NMAX];

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

int ok(int val)
{
    int mx = 0;
    for (int i = 1; i <= n; i++)
    {
        int last = mx;
        for (int k = 0; k * a[i] <= val; k++)
            if ((val - k * a[i]) % b[i] == 0)
            {
                int nr = (val - k * a[i]) / b[i];
                for (int j = 0; j <= last and j + k <= BIG; j++)
                {
                    if (dplast[j][0] + nr > dplast[j + k][0])
                    {
                        dp[j + k][0] = dplast[j][0] + nr;
                        for (int ind = 1; ind < i; ind++)
                            dp[j + k][ind] = dplast[j][ind];
                        dp[j + k][i] = k;
                    }
                    else
                        for (int ind = 0; ind < i; ind++)
                            dp[j + k][ind] = dplast[j + k][ind];
                    if (dp[j + k][0] != 0)
                        mx = max(mx, j + k);
                }
            }
        memcpy(dplast, dp, sizeof(dp));
    }
    for (int i = l; i <= mx; i++)
        if (dp[i][0] >= l)
            return i;
    return -1;
}
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];
    }
    int st = 1, dr = BIG, med, sol = -1, care = 0;
    while (st <= dr)
    {
        med = ((st + dr) >> 1);
        int val = ok(med);
        if (val != -1)
        {
            sol = med;
            care = val;
            dr = med - 1;
            memcpy(last, dp, sizeof(dp));
        }
        else
            st = med + 1;
        memset(dplast, 0, sizeof(dplast));
        memset(dp, 0, sizeof(dp));
    }
    cout << sol <<"\n";
    for (i = 1; i <= n; i++)
        cout << last[care][i] << " " << (sol - last[care][i] * a[i]) / b[i] << "\n";
}