Cod sursa(job #1292722)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 14 decembrie 2014 18:07:48
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>

#define Nmax 100 + 10
#define F first
#define S second

using namespace std;

int N , L , i , j , SOL;
int D[Nmax][Nmax] , opt[Nmax][Nmax];
pair < int , int > a[Nmax] , v[Nmax];


bool CAN (int T)
{
    memset(opt, 0, sizeof(opt));
    memset(D, 0, sizeof(D));

    for (i=0; i <= N; ++i)
     for (j=1; j <= L; ++j)
      D[i][j] = INT_MIN;

    for (i=1; i <= N; ++i)
     for (j=0; j <= L; ++j)
      for (int l = 0; l <= min(T / a[i].F, j); ++l)
      {
          if (D[i-1][j-l] == INT_MIN) continue;
          if (D[i][j] >= D[i-1][j-l] + (T - l * a[i].F)/a[i].S) continue;

          D[i][j] = D[i-1][j-l] + (T - l * a[i].F)/a[i].S;
          opt[i][j] = l;
      }

    if (D[N][L]>=L) return true;
    return false;

}

void cb ()
{
    int st = 0; int dr = L*(a[1].F+a[1].S);

    for (int mij = (st+dr)>>1; st <= dr; mij = (st+dr)>>1)
    {
        if (CAN(mij)) SOL = mij, dr = mij-1;
        else st = mij+1;
    }

    for (int i = N; i >= 1; --i)
    {
        v[i].F = opt[i][L];
        L -= v[i].F;
        v[i].S = (SOL - v[i].F*a[i].F) / a[i].S;
    }

}

int main()
{
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);

    scanf("%d %d", &N, &L);

    for (i=1; i <= N; ++i)
     scanf("%d %d", &a[i].F, &a[i].S);

    cb();

    printf("%d\n", SOL);
    for (i = 1; i <= N; ++i)
     printf("%d %d\n", v[i].F, v[i].S);

    return 0;
}