Cod sursa(job #2786449)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 20 octombrie 2021 23:01:07
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.88 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int maxN=100;
struct bautor {
    int a, b;
}v[maxN + 5], c[maxN + 5];

int st, dr, n, L, dp[maxN + 5][maxN + 5], ans, lb, la;

bool valid(int t)
{
    memset(dp, 0, sizeof dp);
    for(int j = 0; j <= 100; j++)
        dp[1][j] = (t - v[1].a * j)/ v[1].b;
    for(int i = 2; i <= n; i++)
    {
        for(int j = 0; j <= 100; j++)
        {
            for(int k = 0; k <= j; k++)
            {
                if(dp[i-1][k] < 0)
                    continue;
                if((j - k) / v[i].a > t)
                    continue;
                if((t - ((j - k) * v[i].a)) % v[i].b != 0)
                    continue;
                int val = dp[i-1][k] + (t - ((j - k) * v[i].a))/v[i].b;
                dp[i][j] = max(dp[i][j], val);
            }
        }
    }
    for(int j = L; j <= 100; j++)
        if(dp[n][j] >= L)
            return 1;
    return 0;
}

int main()
{
    fin >> n >> L;
    for(int i = 1; i <= n; i++)
        fin >> v[i].a >> v[i].b;
    st = 1;
    dr = L;
    while(st <= dr)
    {
        int med = (st + dr)/2;
        if(valid(med))
        {
            ans = med;
            dr = med - 1;
        }
        else
            st = med + 1;
    }
    fout << ans << '\n';
    memset(dp, 0, sizeof dp);
    for(int j = 0; j <= 100; j++)
        dp[1][j] = (ans - v[1].a * j)/ v[1].b;
        for(int i = 2; i <= n; i++)
    {
        for(int j = 0; j <= 100; j++)
        {
            for(int k = 0; k <= j; k++)
            {
                if(dp[i-1][k] < 0)
                    continue;
                if((j - k) / v[i].a > ans)
                    continue;
                if((ans - ((j - k) * v[i].a)) % v[i].b != 0)
                    continue;
                int val = dp[i-1][k] + (ans - ((j - k) * v[i].a))/v[i].b;
                dp[i][j] = max(dp[i][j], val);
            }
        }
    }
    for(int j = L; j <= 100; j++)
        if(dp[n][j] >= L)
            {
                la = j;
                lb = dp[n][j];
                break;
            }
    for(int i = n; i > 0; i--)
    {
        for(int j = 0; j <= la; j++)
            {
                if(dp[i-1][j] < 0)
                    continue;
                if((la - j) / v[i].a > ans)
                    continue;
                if((ans - ((la - j) * v[i].a)) % v[i].b != 0)
                    continue;
                if(dp[i][la] == dp[i-1][j] + (ans - ((la - j) * v[i].a))/v[i].b)
                {
                    c[i].a = la - j;
                    c[i].b = (ans - ((la - j) * v[i].a))/v[i].b;
                    la = j;
                    break;
                }
            }
    }
    for(int i = 1; i <= n; i++)
        fout<<c[i].a<<' '<<c[i].b<<'\n';
    return 0;
}