Cod sursa(job #2663840)

Utilizator pregoliStana Andrei pregoli Data 27 octombrie 2020 14:07:29
Problema Lapte Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <bits/stdc++.h>
using namespace std;
#define STOP fout.close(); exit(EXIT_SUCCESS);
ifstream fin("lapte.in");
ofstream fout("lapte.out");
///***********************
const int NMAX = 103;
struct Dude {
    int a, b;
} d[NMAX], ans2[NMAX][NMAX][NMAX];
int n, l, ans;
bool dp[NMAX][NMAX][NMAX];

void read() {
    fin >> n >> l;
    for (int i = 1; i <= n; i++)
        fin >> d[i].a >> d[i].b;
}

void init() {
    dp[0][0][0] = true;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= l; j++)
            for (int k = 0; k <= l; k++)
                dp[i][j][k] = false;
        dp[i][0][0] = true;
    }
}

bool check(int t) {
    init();
    for (int i = 1; i <= n; i++)
        for (int j = 0; j <= l; j++)
            for (int k = 0; k <= l; k++)
                for (int x = 0; x * d[i].a <= t && x <= j; x++) {
                    int y = (t - x * d[i].a) / d[i].b;
                    if (k >= y) {
                        if (dp[i - 1][j - x][k - y]) {
                            ans2[i][j][k] = {x, y};
                            dp[i][j][k] = 1;//cout << x << ' ' << y << endl;
                            break;
                        }
                    } else {
                        if (dp[i - 1][j - x][0]) {
                            ans2[i][j][k] = {x, k};
                            dp[i][j][k] = 1;//cout << x << ' ' << k << endl;
                            break;
                        }
                    }
                }
    return dp[n][l][l];
}

void solve() {
    int l = 0, r = 100 * 100;
    while (l <= r) {
        int mid = (l + r) >> 1;
        if (check(mid)) {
            ans = mid;
            r = mid - 1;
        }
        else
            l = mid + 1;
    }
    fout << ans << '\n';
}

void build(int i, int j, int k) {
    if (!i)
        return;
    build(i - 1, j - ans2[i][j][k].a, k - ans2[i][j][k].b);
    //cout<<i<<' '<<j<<' '<<k<<endl;
    fout << ans2[i][j][k].a << ' ' << ans2[i][j][k].b << '\n';
}

int main() {
    read();
    solve();
    check(ans);
    build(n, l, l);
    //for (int i=1;i<=l;i++){for(int j=1;j<=l;j++)cout<<ans2[n][i][j].b<<' '; cout<<endl;}
    STOP
}