Cod sursa(job #2710433)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 22 februarie 2021 16:18:31
Problema Lapte Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f

using namespace std;

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

const int NMAX = 128;

class person {
    public:
        int a, b;
} v[NMAX], sol[NMAX][NMAX];

int N, L, dp[NMAX][NMAX];

bool check(const int &x) {
    for(int i = 0; i <= N; ++i)
        for(int j = 0; j <= L; ++j)
            dp[i][j] = -INF;
    dp[0][0] = 0;
    for(int i = 1; i <= N; ++i)
        for(int j = 0; j <= L; ++j)
            for(int k = 0; k <= j && v[i].a * k <= x; ++k) {
                int rem_time = x - (v[i].a * k);
                int add = rem_time / v[i].b;
                if(dp[i][j] < dp[i - 1][j - k] + add) {
                    dp[i][j] = dp[i - 1][j - k] + add;
                    sol[i][j] = person{k, add};
                }
            }
    return dp[N][L] >= L;
}

void solve(const int &A, const int &B) {
    if(A == 1) {
        fout << sol[A][B].a << ' ' << sol[A][B].b << '\n';
        return;
    }
    solve(A - 1, B - sol[A][B].a);
    fout << sol[A][B].a << ' ' << sol[A][B].b << '\n';
}

int main() {
    fin >> N >> L;
    for(int i = 1; i <= N; ++i)
        fin >> v[i].a >> v[i].b;
    int st = 1, dr = 1e4, ans = 1e4 + 1;
    while(st <= dr) {
        int mid = (st + dr) >> 1;
        if(check(mid)) {
            ans = mid;
            dr = mid - 1;
        }
        else
            st = mid + 1;
    }
    fout << ans << '\n';
    solve(N, L);
}