Cod sursa(job #2085838)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 10 decembrie 2017 20:03:46
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <algorithm>
#define DIM 102
#define INF 2e9
#define ff first
#define ss second

using namespace std;

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

int n, l, st;

pair<int, int> pers[DIM], sol[DIM];
int dp[DIM][DIM];

bool calc(int t){
    for(int i = 0; i < DIM; ++ i)
        for(int j = 0; j < DIM; ++ j)
            dp[i][j] = -INF;
    for(int i = 1; i <= n; ++ i){
        for(int j = 1; j <= l; ++ j){
            dp[i][j] = -INF;
            for(int k = 0; k <= t; ++ k){
                dp[i][j] = max(dp[i][j], dp[i - 1][j - k / pers[i].ff] + (t - k) / pers[i].ss);
            }
        }
    }
    if(dp[n][l] >= l)
        return 1;
    else
        return 0;
}

void rebuild(int t){
    int j = l;
    for(int i = n; i >= 1; -- i){
        for(int k = 0; k <= t; ++ k){
            if(dp[i][j] == dp[i - 1][j - k / pers[i].ff] + (t - k) / pers[i].ss){
                sol[i].ff = k / pers[i].ff;
                sol[i].ss = (t - k) / pers[i].ss;
                j -= k / pers[i].ff;
                break;
            }
        }
    }
}

int main()
{
    f>>n>>l;
    for(int i = 1; i <= n; ++ i)
        f>>pers[i].ff>>pers[i].ss;
    int st = 1;
    int dr = 100;
    //sort(pers + 1, pers + n + 1);
    while(st <= dr){
        int mid = (st + dr) / 2;
        if(calc(mid))
            dr = mid - 1;
        else
            st = mid + 1;
    }
    calc(st);
    rebuild(st);
    g<<st<<'\n';
    for(int i = 1; i <= n; ++ i){
        g<<sol[i].ff<<" "<<sol[i].ss<<'\n';
    }


    return 0;
}