Pagini recente » Cod sursa (job #1030203) | Cod sursa (job #1178927) | Cod sursa (job #1162882) | Cod sursa (job #843636) | Cod sursa (job #2395833)
#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;
}