Cod sursa(job #1784668)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 20 octombrie 2016 12:44:53
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMax = 105;

int A[NMax];
int B[NMax];

inline bool check(const int &n, const int &m, const int &t){

    int D[2][NMax];
    for(int i = 0; i <= m; i++) D[0][i] = -NMax * NMax * NMax;
    for(int i = 0; i <= m; i++) D[1][i] = 0;
    D[0][0] = 0;

    int cur = 1;
    for(int i = 1; i <= n; i++){
        for(int j = 0; j <= m && j * A[i] <= t; j++){
            const int l = (t - j * A[i]) / B[i];
            for(int k = m; k - j >= 0; k--){
                D[cur][k] = max(D[cur][k], D[1 - cur][k - j] + l);
            }
        }
        cur = 1 - cur;
    }

    cur = 1 - cur;
    return D[cur][m] >= m;

}

inline void solve(const int &n, const int &m, const int &t){

    int D[NMax][NMax];
    for(int i = 0; i <= n; i++){
        for(int j = 0; j <= m; j++){
            D[i][j] = -NMax * NMax * NMax;
        }
    }
    D[0][0] = 0;

    pair < int, int > prev[NMax][NMax];
    for(int i = 1; i <= n; i++){
        for(int j = 0; j <= m && j * A[i] <= t; j++){
            const int l = (t - j * A[i]) / B[i];
            for(int k = m; k - j >= 0; k--){
                if(D[i - 1][k - j] + l > D[i][k]){
                    D[i][k] = D[i - 1][k - j] + l;
                    prev[i][k] = {j, l};
                }
            }
        }
    }

    vector < pair < int, int > > rez(n);
    for(int i = n, j = m; i > 0; i--){

        rez[i - 1] = prev[i][j];
        j -= rez[i - 1].first;

    }

    for(auto it: rez) fout << it.first << " " << it.second << "\n";

}

int main(){

    ios::sync_with_stdio();
    fin.tie(NULL);

    int n, m;
    fin >> n >> m;

    for(int i = 1; i <= n; i++) fin >> A[i] >> B[i];

    int lo, hi, mid, ans;
    lo = 1; hi = NMax * NMax;
    while(lo <= hi){

        mid = (lo + hi) / 2;
        if(check(n, m, mid) == true){
            ans = mid;
            hi = mid - 1;
        } else {
            lo = mid + 1;
        }

    }

    fout << ans << "\n";
    solve(n, m, ans);

    return 0;
}