Cod sursa(job #2395833)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 2 aprilie 2019 21:48:23
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#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;

int v[2][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 n, l;

bool _try ( int tim )
{
  int i, j, k, z, _m;
  for ( i = 0; i <= l; i++ )
    for ( j = 0; j <= n; j++ ) dp[i][j] = 0;
  for ( _m = inf, z = 1; z <= n; z++ ) _m = min(_m, v[1][z]);
  for ( i = 1; i <= l; i++ ) dp[i][1] = (tim-v[0][1]*i)/_m;
  for ( i = 1; i <= l; i++ )
    for ( j = 1; j <= n; j++ )
    {
      ///dp[i][j-1]
      for ( k = 0; k <= i; k++ ) /// omul j preia k litri din cei i
        dp[i][j] = max(dp[i][j], dp[i-k][j-1] - k*v[1][j]/_m);
      /// dp[i-1][j]
      for ( k = 1; k <= j; k++ ) /// cineva din [1,k] trebuie sa mai bea un litru
        dp[i][j] = max(dp[i][j], dp[i-1][j] + dp[i][k] - dp[i-1][k]);
    }
  return dp[l][n] >= l;
}

int main ()
{
  ifstream fin ( "lapte.in" );
  ofstream fout ( "lapte.out" );
  fin >> n >> l;

  int i, j, k, z;
  for ( i = 1; i <= n; i++ ) fin >> v[0][i] >> v[1][i];

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

  fout << tim;

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

  return 0;
}