Cod sursa(job #1519720)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 7 noiembrie 2015 19:05:44
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;

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

const int maxn = 105;
const int oo = 0x3f3f3f3f;
int A[maxn];
int B[maxn];
int dp[maxn][maxn];
int dad[maxn][maxn];

int n, l;

bool check(int T)
{
    memset(dp, -oo, sizeof(dp));
    memset(dad, 0, sizeof(dad));
    dp[0][0] = 0;
    for(int i = 1; i <= n; i++)
        for(int j = 0; j <= l; j++)
            for(int k = 0 ; k <= j ; ++ k)
                if(T - (j-k) * A[i] >= 0 &&
                   dp[i][j] < dp[i-1][k] + (T - (j-k) * A[i]) / B[i]) {
                        dp[i][j] = dp[i-1][k] + (T - (j-k) * A[i]) / B[i];
                        dad[i][j] = k;
                }
    return dp[n][l] >= l;
}
int main()
{
    /**
    dp[i][j] = cantitatea totala de lapte B bauta de primii i oameni,
    stiind ca s-a baut j litri de lapte A
    toate astea intr-un timp T fixat


    dp[i][j] = dp[i - 1][k] + (T - (j - k) * A[i]) / B[i]

    dp[n][l] >= l
    **/

    in >> n >> l;
    for(int i = 1; i <= n; i++)
        in >> A[i] >> B[i];
    int st = 0, dr = 200;
    int ret = 0;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        if(check(mij))
        {
            ret = mij;
            dr = mij - 1;
        }
        else
            st = mij + 1;
    }
    out << ret;
    check(ret);
    int i = n, j = l;
    vector <pair<int, int> > rasp;
    while(i) {
        int k = dad[i][j];
        int laptea = j - k;
        int lapteb = dp[i][j] - dp[i - 1][k];
        rasp.push_back(make_pair(laptea, lapteb));
        i = i - 1;
        j = k;
    }
    reverse(rasp.begin(), rasp.end());
    out << '\n';
    for(auto it : rasp)
        out << it.first << ' ' << it.second << '\n';
    return 0;
}