Cod sursa(job #3257223)

Utilizator Nasa1004Ema Nicole Gheorghe Nasa1004 Data 16 noiembrie 2024 22:23:31
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <fstream>
#include <stack>

using namespace std;
const int NMAX = 100;
const int INF = 21e8;

ifstream cin("lapte.in");
ofstream cout("lapte.out");

int a[NMAX + 2], b[NMAX + 2];
int n, l;

int dp[NMAX + 2][NMAX + 2]; ///in primii i oameni, maxL B dc s-au baut j L de A
int ult[NMAX + 2][NMAX + 2]; ///dir din care 'vine' (nr la CARE am adaugat lapte)

void print() {
    for(int i = 1; i <= n; i++) {
        for(int j = 0; j <= l; j++) {
            cout << dp[i][j] << " ";
        }
        cout << '\n';
    }
    cout << '\n';
}
void init() {
    for(int i = 0; i <= n; i++) { ///ca sa NU ne ia ans-urile alea drept bune
        for(int j = 0; j <= NMAX; j++) {
            dp[i][j] = -INF; ///mai safe si merge dc pt TOATA mat
        }
    }
    dp[0][0] = 0;
}
bool check(int t) {
    init();
    for(int i = 1; i <= n; i++) { ///prin fiec elem
        for(int A = 0; A <= NMAX; A++) { ///cati L de A s-au baut deja
            for(int x = 0; x * a[i] <= t; x++) { ///cati L de A bea omu nostru
                int y = (t - x * a[i]) / b[i]; ///am adaugat si x si y (pe nextR)
                    if(A + x <= l) {
                        if(dp[i - 1][A] + y > dp[i][A + x]) {
                            dp[i][A + x] = dp[i - 1][A] + y;
                            ult[i][A + x] = A; ///care era INAINTE
                        }
                    }
            }
        }
    }
    //print();
    return (dp[n][l] >= l);
}
stack <pair <int, int>> sol; ///a, b
int main()
{
    int maxx = 0;
    cin >> n >> l;
    for(int i = 1; i <= n; i++) {
        cin >> a[i] >> b[i];
        maxx = max(maxx, (a[i] + b[i]) * l);
    }
    int st = 0, dr = maxx, ans = maxx;
    while(st <= dr) {
        int mid = (st + dr) / 2;
        if(check(mid)) {
            //cout << "yeee " << mid << '\n';
            ans = mid;
            dr = mid - 1;
        }
        else
            st = mid + 1;
    }
    cout << ans << '\n';
    check(ans);
    int i = n, j = l;
    while(i != 0 || j != 0) {
        int dir = ult[i][j]; ///noul A,care va fi
        int difb = dp[i][j] - dp[i - 1][dir];
        sol.push({j - dir, difb});
        i--;
        j = dir;
    }
    while(!sol.empty()) {
        cout << sol.top().first << " " << sol.top().second << '\n';
        sol.pop();
    }
    return 0;
}