Pagini recente » Cod sursa (job #2485496) | Cod sursa (job #889160) | Cod sursa (job #1118636) | Cod sursa (job #2544697) | Cod sursa (job #1737081)
#include <cstdio>
#include <iostream>
using namespace std;
const int nmx = 102;
int oameni, lapte_de_baut;
int timp_a[nmx], timp_b[nmx];
int dp[nmx][nmx], mutare[nmx][nmx];
int copie_dp[nmx][nmx], copie_mutare[nmx][nmx], timp_cautat;
int litri_a[nmx], litri_b[nmx];
void citire()
{
scanf("%d %d", &oameni, &lapte_de_baut);
for(int i = 1; i <= oameni; ++i)
scanf("%d %d", &timp_a[i], &timp_b[i]);
}
void curatare()
{
for(int i = 0; i < nmx; ++i)
for(int j = 0; j < nmx; ++j)
{
dp[i][j] = 0;
mutare[i][j] = 0;
}
}
bool timp_bun(int timp)
{
curatare();
int pos = 0;
while((timp - timp_a[1]*pos) / timp_b[1] > 0)
{
dp[1][pos] = (timp - timp_a[1]*pos) / timp_b[1];
++ pos;
}
for(int i = 2; i <= oameni; ++i)
for(int j = 0; j <= lapte_de_baut; ++j)
for(int y = j; y >= 0; --y)
if(timp_a[i] * (j - y) <= timp && dp[i][j] < dp[i-1][y] + (timp - (timp_a[i] * (j - y))) / timp_b[i])
{
dp[i][j] = dp[i-1][y] + (timp - (timp_a[i] * (j - y))) / timp_b[i];
mutare[i][j] = y;
}
if(dp[oameni][lapte_de_baut] >= lapte_de_baut)
return 1;
return 0;
}
void memoreaza(int timp)
{
timp_cautat = timp;
for(int i = 0; i < nmx; ++i)
for(int j = 0; j < nmx; ++j)
{
copie_dp[i][j] = dp[i][j];
copie_mutare[i][j] = mutare[i][j];
}
}
void cautare_binara()
{
int stanga = 1, dreapta = 100;
while(stanga <= dreapta)
{
int mijloc = (stanga + dreapta) / 2;
if(timp_bun(mijloc))
{
memoreaza(mijloc);
dreapta = mijloc - 1;
}
else
{
stanga = mijloc + 1;
}
}
}
void reconstituire()
{
int i = oameni, j = lapte_de_baut;
while(i > 1)
{
int diferenta = j - mutare[i][j];
litri_b[i] = dp[i][j] - dp[i-1][j-diferenta];
litri_a[i] = diferenta;
-- i;
j -= diferenta;
}
litri_a[1] = j;
litri_b[1] = dp[1][j];
}
void afish()
{
printf("%d\n", timp_cautat);
for(int i = 1; i <= oameni; ++i)
printf("%d %d\n", litri_a[i], litri_b[i]);
}
int main()
{
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
citire();
cautare_binara();
reconstituire();
afish();
}