Cod sursa(job #2149746)

Utilizator amaliarebAmalia Rebegea amaliareb Data 2 martie 2018 22:36:00
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n, l, d[105][105], urm[105][105];
bool r[105][105];
struct miau{int x, y;} v[105], rasp[105];

bool check(int t) {
    memset(d, 0, sizeof(d));
    memset(r, 0, sizeof(r));
    r[0][0] = 1;
    for (int i = 1; i <= n; ++i) {
        int maxa = min(l, t / v[i].x);
        for (int j = 0; j <= l; ++j) {
            for (int k = 0; k <= maxa; ++k)
                if (r[i - 1][max(j - k, 0)] && d[i][j] <= d[i - 1][max(j - k, 0)] + (t - k * v[i].x) / v[i].y) {
                    r[i][j] = 1;
                    d[i][j] = d[i - 1][max(j - k, 0)] + (t - k * v[i].x) / v[i].y;
                    urm[i][j] = min(k, j);
                }
        }
    }
    return d[n][l] >= l;
}

int cautbin() {
    int rez = 0, pas = 1 << 8;
    while (pas) {
        if (rez + pas <= 100 && !check(rez + pas)) rez += pas;
        pas /= 2;
    }
    return rez + 1;
}

int main()
{
    f >> n >> l;
    for (int i = 1; i <= n; ++i) f >> v[i].x >> v[i].y;
    int ans = cautbin();
    g << ans << '\n';
    check(ans);
    int poz = n, q = l;
    while (poz) {
        int dif = urm[poz][q];
        rasp[poz].x = dif;
        rasp[poz].y = (ans - dif * v[poz].x) / v[poz].y;
        q -= dif;
        --poz;
    }
    for (int i = 1; i <= n; ++i) g << rasp[i].x << ' ' << rasp[i].y << '\n';
    return 0;
}