Cod sursa(job #3261539)

Utilizator Allie28Radu Alesia Allie28 Data 6 decembrie 2024 18:17:19
Problema Lapte Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 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(2, vector<int> (LMAX, -1));
    dp[0][0] = 0;
    int x, y, line, i, la;
    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 <= 100; la++) {
                if (dp[1 - line][la - x] != -1 && dp[1 - line][la - x] + y > dp[line][la]) {
//                    fout<<dp[1 - line][la - x]<<" ";
                    dp[line][la] = dp[1 - line][la - x] + y;
//                    fout<<i<<" "<<la<<" "<<x<<endl;
                    reconst[i][la] = la - x;
                }
            }
        }
    }
    for (la = l; la <= 100; la++) {
        if (dp[line][la] >= l) return 1;
    }
    return 0;
}

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;
    while (j <= 100 && dp[(n&1)][j] < l) {
        j++;
    }
    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;
}