Cod sursa(job #3261548)

Utilizator Allie28Radu Alesia Allie28 Data 6 decembrie 2024 18:33:55
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <vector>
#include <queue>
#include <fstream>
#include <iostream>
#include <climits>

using namespace std;

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

const int LMAX = 105;
//const int MOD = 1000000007;

//caut binar timpul minim pentru a bea cantitatea de lapte
//dp[i][la] -> cantitatea maxim de lapte b daca se beau la litrii de lapte
//va[i] -> timpul in care se bea un litru
//x se va duce pana la t/va[i] si y va fi t - va[i]*x/vb[i]
int va[LMAX], vb[LMAX], n, l, reconst[LMAX][LMAX];
vector<vector<int>> dp;

bool check(int t) { //timpul minim
    dp.assign(LMAX, vector<int> (LMAX, -1));
    dp[0][0] = 0;
    int x, y, i, la, line;
    for (i = 1; i <= n; i++) {
//        line = (i&1);
        for (x = 0; x <= t/va[i]; x++) {
            y = (t - va[i]*x)/vb[i];
            for (la = x; la <= l; la++) {
                if (dp[i - 1][la - x] != -1 && dp[i - 1][la - x] + y > dp[i][la]) {
                    dp[i][la] = dp[i - 1][la - x] + y;
                    reconst[i][la] = la - x;
                }
            }
        }
    }
    return dp[n][l] >= l;
}

int main() {
    int i, j;
    fin>>n>>l;
    for (i = 1; i <= n; i++) {
        fin>>va[i]>>vb[i];
    }
    int s, d, mij;
    s = -1;
    d = 100;
    while (s + 1 != d) {
        mij = ((s + d)>>1);
        if (check(mij)) d = mij;
        else s = mij;
    }
    fout<<d<<"\n";
    check(d);
    vector<int> sol;
    j = l;
    i = n;
    while (i > 0) {
        sol.push_back(j);
        j = reconst[i][j];
        i--;
    }
    sol.push_back(0);
    for (i = n - 1; i >= 0; i--) {
        int cant = sol[i] - sol[i + 1]; //cantitatea de a bauta
        fout<<cant<<" "<<(d - va[n - i]*cant)/vb[n - i]<<"\n";

    }




    fin.close();
    fout.close();

    return 0;
}