Pagini recente » Cod sursa (job #3285638) | Cod sursa (job #1541763) | Cod sursa (job #2156413) | Cod sursa (job #2424799) | Cod sursa (job #3293404)
#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);
for ( i = 1; i <= n; ++i )
dp[i][0] = dp[i - 1][0] + T / t2[i];
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 = 0; x <= j && x * t1[i] <= T; ++x )
{
y = (T - x * t1[i]) / t2[i];
if ( dp[i][j] < dp[i - 1][j - x] + y )
{
dp[i][j] = dp[i - 1][j - x] + y;
tata[i][j] = {i - 1,j - x};
}
}
}
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;
}
pair <int, int> nxt = tata[ind.first][ind.second];
solution[ind.first] = {ind.second - nxt.second, dp[ind.first][ind.second] - dp[nxt.first][nxt.second]};
for ( i = 1; i <= n; ++i )
fout << solution[i].first << " " << solution[i].second << "\n";
return 0;
}