Pagini recente » Cod sursa (job #2956295) | Cod sursa (job #501034) | Cod sursa (job #1645604) | Cod sursa (job #2649618) | Cod sursa (job #2396643)
#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], mdp[maxn+5][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]
pii prew[maxn+5][maxn+5], mprew[maxn+5][maxn+5];
int n, l;
ifstream fin ( "lapte.in" );
ofstream fout ( "lapte.out" );
void mem ( int n, int l )
{
for ( int i = 0; i <= l; i++ )
for ( int j = 0; j <= n; j++ ) mdp[i][j] = dp[i][j], mprew[i][j] = prew[i][j];
}
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 ( i = 1; i <= l; i++ ) dp[i][1] = (tim - i*v[0][1]) / v[1][1];
for ( j = 2; j <= n; j++ ) dp[1][j] = max(dp[1][j-1], (tim-v[0][j])/v[1][j]);
for ( i = 1; i <= l; i++ )
for ( j = 2; j <= n; j++ )
for ( k = 1; k <= i; k++ )
if ( dp[i][j] < dp[i-k][j-1] + (tim-k*v[0][j])/v[1][j] ) dp[i][j] = dp[i-k][j-1] + (tim-k*v[0][j])/v[1][j], prew[i][j] = {i,k};
return (dp[l][n] >= l);
}
void sol ( int i, int j )
{
int ni = mprew[i][j].fi - mprew[i][j].se, nj = j-1;
if ( nj >= 1 ) sol (ni,nj);
fout << mprew[i][j].se << ' ' << mdp[i][j] - mdp[ni][nj] << '\n';
}
int main ()
{
fin >> n >> l;
int i, j, k, z;
for ( i = 1; i <= n; i++ ) fin >> v[0][i] >> v[1][i];
int pas = (1<<7), tim = (1<<7);
for ( ; pas > 0; pas /= 2 )
if ( tim - pas >= 0 && _try(tim-pas) == 1 ) tim -= pas, mem(n,l);
fout << tim << '\n';
sol (l,n);
fin.close ();
fout.close ();
return 0;
}