Cod sursa(job #2397671)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 4 aprilie 2019 17:56:15
Problema Lapte Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
/// generator nu mai e veata
#include <bits/stdc++.h>
#define maxn 100
#define pii pair<int,int>
#define fi first
#define se second
#define inf INT_MAX/2-1

using namespace std;

struct yes
{
  int a, b, ind;
};

yes v[maxn+5];
int dp[maxn+5][maxn+5]; /// dp[i][j] -- nr maxim de litri B care pot fi bauti in timpul ramas din cele tim secunde cu exact i litri bauti din
/// tipul a numai cu oamenii din [1,j]
int prew[maxn+5][maxn+5];
int n, l, flag;

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

bool _try ( int tim )
{
  int i, j, k, z, ret = 0;
  for ( i = 0; i <= l; i++ )
    for ( j = 0; j <= n; j++ ) dp[i][j] = -1, prew[i][j] = 0;
  for ( i = 0; i <= l; i++ ) dp[i][1] = max(-1,(tim - i*v[1].a) / v[1].b), prew[i][1] = i;
  dp[0][0] = 0;

  for ( i = 0; i <= l; i++ )
    for ( j = 2; j <= n; j++ )
    {
      for ( k = 0; k <= i && tim >= k*v[j].a; k++ )
        if ( dp[i-k][j-1] >= 0 )
        {
          z = dp[i-k][j-1] + (tim-k*v[j].a)/v[j].b;
          if ( dp[i][j] < z ) dp[i][j] = z, prew[i][j] = k;
        }
    }
  return dp[l][n] >= l;
}

void sol ( int tim, int i, int j )
{
  int ni = i - prew[i][j], nj = j-1;
  if ( nj >= 1 ) sol (tim,ni,nj);
  fout << prew[i][j] << ' ' << (tim-prew[i][j]*v[j].a)/v[j].b << '\n';
}

int main ()
{
  fin >> n >> l;

  int i;
  for ( i = 1; i <= n; i++ ) fin >> v[i].a >> v[i].b, v[i].ind = i;

  int pas = (1<<13), tim = (1<<13);
  for ( ; pas > 0; pas /= 2 )
    if ( tim - pas >= 0 && _try(tim-pas) == 1 ) tim -= pas;

  fout << tim << '\n';
  _try(tim);
  sol (tim,l,n);

  fin.close ();
  fout.close ();

  return 0;
}