Cod sursa(job #2204078)

Utilizator ioana_marinescuMarinescu Ioana ioana_marinescu Data 14 mai 2018 13:35:37
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <algorithm>
const int MAX_N = 100;

using namespace std;

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

int n, l, t;
int tA[MAX_N + 1], tB[MAX_N + 1], solA[MAX_N + 1], solB[MAX_N + 1];
int bMax[MAX_N + 1][MAX_N + 1], sePoate[MAX_N + 1][MAX_N + 1];

int verif(int t)
{
    for (int i = 0; i <= n; i++)
      for (int j = 0; j <= l; j++)
        sePoate[i][j]=-2000000000;

    for (int i = 1; i <= n; i++)
      for (int j = 0; j <= l; j++)
        bMax[i][j] = (t - j * tA[i]) / tB[i];

    sePoate[0][0] = 0;

    for (int i = 1; i <= n; i++)
      for (int j = 0; j <= l; j++)
        for (int k = 0 ; k <= j && k * tA[i] <= t; k++)
          sePoate[i][j] = max(sePoate[i][j], sePoate[i-1][j-k] + bMax[i][k]);

    return sePoate[n][l] >= l;
}

int bs()
{
    int st = 1, dr = 100, mij, sol = 0;
    while (st <= dr) {
        mij = (st + dr) / 2;
        if (verif(mij)) {
            sol = mij;
            dr= mij - 1;
        }
        else
            st = mij + 1;
   }
   return sol;
}

int main()
{
    fin >> n >> l;
    for (int i = 1; i <= n; i++)
        fin >> tA[i] >> tB[i];
    t = bs();
    fout << t << '\n';
    verif(t);
    int ll = l;
    for (int i = n; i >= 1; i--)
      for (int j = 0; j <= ll && j * tA[i] <=t; j++)
        if (sePoate[i-1][ll-j] + bMax[i][j] == sePoate[i][ll]) {
            solA[i] = j;
            solB[i] = bMax[i][j];
            ll-=j;
            break;
        }
    for (int i = 1; i <= n; i++)
      fout << solA[i] << " " << solB[i] << '\n';
    return 0;
}