Cod sursa(job #3317136)

Utilizator traian_Dobrescu Traian traian_ Data 22 octombrie 2025 14:18:01
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.2 kb
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <unordered_set>
#include <numeric>
#include "stdio.h"
using namespace std;

#define ll long long
const int inf = 0x3f3f3f3f;

int n, k;
int a[100], b[100];
pair<int,int> cap(int w, int t, int u) {
    int r1 = min(u, t/a[w]);
    int r2 = (t-a[w]*r1)/b[w];

    return {r1, r2};
}

void solve() {
    cin >> n >> k;
    for(int i=0;i<n;i++) {
        cin >> a[i] >> b[i];
    }
    int ret = 0;
    for(int dt = 1 << 8;dt;dt>>=1) {
        int t = ret + dt;
        int dp[101][101]{};
        int dpp[101][101]{};
        for(int j=0;j<=k;j++) {
            if(a[0]*j > t) {
                dp[0][j] = -1;
                continue;
            }
            pair<int, int> c = cap(0, t, j);
            dp[0][j] = c.second;
            dpp[0][j] = 0;
        }
        for(int i=1;i<n;i++) {
            for(int j=0;j<=k;j++) {
                int max = -1;
                int maxi = -1;
                for(int h=0;h<=j;h++) {
                    int ureq = j-h;
                    pair<int, int> c = cap(i, t, h);
                    if(h != c.first) break;
                    
                    if(dp[i-1][ureq] == -1) {
                        continue;
                    }
                    int v = dp[i-1][ureq] + c.second;
                    if(v > max) {
                        max = v;
                        maxi = ureq;
                    }
                }
                dp[i][j] = max;
                dpp[i][j] = maxi;
            }
        }

        if(dp[n-1][k] < k) {
            ret += dt;
        }
    }
    int t = ret + 1;
    int dp[101][101]{};
    int dpp[101][101]{};
    for(int j=0;j<=k;j++) {
        if(a[0]*j > t) {
            dp[0][j] = -1;
            continue;
        }
        pair<int, int> c = cap(0, t, j);
        dp[0][j] = c.second;
        dpp[0][j] = 0;
    }
    for(int i=1;i<n;i++) {
        for(int j=0;j<=k;j++) {
            int max = -1;
            int maxi = -1;
            for(int h=0;h<=j;h++) {
                int ureq = j-h;
                pair<int, int> c = cap(i, t, h);
                if(h != c.first) break;
                
                if(dp[i-1][ureq] == -1) {
                    continue;
                }
                int v = dp[i-1][ureq] + c.second;
                if(v > max) {
                    max = v;
                    maxi = ureq;
                }
            }
            dp[i][j] = max;
            dpp[i][j] = maxi;
        }
    }
    vector<pair<int, int>> out;
    int lk = k;
    for(int p=n-1;p>=0;p--) {
        int ureq = dpp[p][lk];
        int loc = lk - ureq;
        pair<int, int> c = cap(p, t, loc);
        out.push_back(c);
        lk = ureq;
    }
    cout << t << "\n";
    for(int i=out.size()-1;i>=0;i--) {
        cout << out[i].first << " " << out[i].second << "\n";
    }
}

int main() {
    #ifdef DEBUG
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    #endif

    #ifdef  INFOARENA
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);
    #endif  //INFOARENA

    solve();
}