Cod sursa(job #3255219)

Utilizator CalinHanguCalinHangu CalinHangu Data 9 noiembrie 2024 18:24:49
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>

#define ll long long
#define pii pair<int, int>
#define x first
#define y second

#define int ll

using namespace std;

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

const int MOD = 1e9 + 7;
const char nl = '\n';
const int NMAX = 105;
const int INF = 1e9;

int n, L, dp[NMAX][NMAX];
pii v[NMAX];
vector<pii> ans;

int check(int t){
    for(int i = 0; i <= n; i++)
        for(int j = 0; j <= L; j++)
            dp[i][j] = -INF;
    dp[0][0] = 0;
    for(int i = 1; i <= n; i++){
        for(int j = 0; j <= L; j++){
            for(int lA = 0; lA <= j; lA++){
                int tB = t - (lA * v[i].x);
                if(tB < 0)
                    break;
                int lB = tB / v[i].y;
                dp[i][j] = max(dp[i][j], dp[i - 1][j - lA] + lB);
            }
        }
    }
    return (dp[n][L] >= L);
}

signed main()
{
    in >> n >> L;
    for(int i = 1; i <= n; ++i)
        in >> v[i].x >> v[i].y;
    int t = 0, left = 1, right = 100;
    while(left <= right){
        int mid = left + (right - left) / 2;
        if(check(mid))
            right = mid - 1;
        else
            left = mid + 1;
    }
    t = right + 1;
    out << t << nl;
    check(t);
    int currA = L, currB = L;
    for(int i = n; i >= 1; i--){
        for(int lA = 0; lA <= currA; lA++){
            int lB = (t - (lA * v[i].x)) / v[i].y;
            if(dp[i][currA] == (dp[i - 1][currA - lA] + lB)){
                ans.push_back({lA, lB});
                currA -= lA;
                currB -= lB;
                break;
            }
        }
    }
    reverse(ans.begin(), ans.end());
    for(int i = 0; i < n; i++)
        out << ans[i].x << ' ' << ans[i].y << nl;
    return 0;
}