Pagini recente » Cod sursa (job #461292) | Cod sursa (job #2933666) | Cod sursa (job #3243863) | Cod sursa (job #2855714) | Cod sursa (job #3293340)
#include <fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int L, n, t1[105], t2[105], dp[105][105];
pair <int, int> tata[105][105], solution[105];
/// dp[i][j] - cantitatea maxima de lapte 2 pe care o beau primii i copii, a.i sa bea SIGUR j litri de lapte 1
bool verif( int T )
{
int i, j;
for ( j = 0; j <= L; ++j )
dp[1][j] = max((T - j * t1[1]) / t2[1], 0);
int mint = 1e9;
for ( i = 1; i <= n; ++i )
{
mint = min(mint, t2[i]);
dp[i][0] = T / mint;
}
for ( i = 2; i <= n; ++i )
for ( j = 1; j <= L; ++j )
{
dp[i][j] = 0;
int x, y;/// x, y - cantitatea de lapte de tip 1 respectiv 2 pe care o bea copilul i
for ( x = 1; x <= L && x * t1[i] <= T; ++x )
{
y = (T - x * t1[i]) / t2[i];
if ( dp[i][j] < dp[i - 1][max(j - x, 0)] + y )
{
dp[i][j] = dp[i - 1][max(j - x, 0)] + y;
tata[i][j] = {i - 1, max(j - x, 0)};
}
}
}
if ( dp[n][L] >= L )
return true;
return false;
}
void afis()
{
for ( int i = 1; i <= n; ++i, fout << endl )
for ( int j = 1; j <= L; ++j )
fout << dp[i][j] << " ";
}
int main()
{
fin >> n >> L;
int i;
for ( i = 1; i <= n; ++i )
fin >> t1[i] >> t2[i];
int st = 1, dr = 100, mij, sol = -1;
while ( st <= dr )
{
mij = (st + dr) / 2;
if ( verif(mij) == true )
{
sol = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
fout << sol << '\n';
bool ceva = verif(sol);
// afis();
// fout << "----------------------------------------\n";
pair <int, int> ind = {n, L};
for ( i = 1; i <= n; ++i )
{
pair <int, int> nxt = tata[ind.first][ind.second];
// fout << nxt.first << " " << nxt.second << endl;
solution[ind.first] = {ind.second - nxt.second, dp[ind.first][ind.second] - dp[nxt.first][nxt.second]};
ind = nxt;
}
//fout << "-----------------------\n";
for ( i = 1; i <= n; ++i )
fout << solution[i].first << " " << solution[i].second << "\n";
return 0;
}