Pagini recente » Cod sursa (job #435230) | Cod sursa (job #435218) | Cod sursa (job #435228) | Cod sursa (job #1765618) | Cod sursa (job #3309166)
#include <bits/stdc++.h>
#define NMAX 101
#define inf 1000000000
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
int timp_a[NMAX], timp_b[NMAX];
int dp[2][NMAX]; ///fie j = numarul de litri de lapte A baut in timpul T, atunci dp[i%2][j] = numarul maxim de litri de lapte B care pot fi bauti de primele i persoane in timpul T
int ult_poz[NMAX][NMAX];
int litri_a[NMAX], litri_b[NMAX]; ///cati litri a baut fiecare persoana
bool posibil(int t, int n, int l) ///verifica daca se pot bea l litri din fiecare lapte in timpul t
{
for(int j=0; j<=l; j++) dp[0][j]=-inf, dp[1][j]=-inf;
dp[0][0]=0;
dp[1][0]=0;
for(int i=1; i<=n; i++)
{
for(int j=0; j<=l; j++)
dp[i%2][j]=dp[(i-1)%2][j];
for(int l_a=0; l_a*timp_a[i]<=t; l_a++) ///l_a = litri bauti din laptele A
{
int l_b = (t - l_a*timp_a[i]) / timp_b[i]; ///l_b = litri bauti din laptele B
for(int j=l_a; j<=l; j++)
{
if(dp[(i-1)%2][j-l_a]+l_b > dp[i%2][j])
{
dp[i%2][j] = dp[(i-1)%2][j-l_a] + l_b;
ult_poz[i][j]=l_a;
}
}
}
}
if(dp[n%2][l]>=l) return 1;
else return 0;
}
int cautare_binara(int n, int l) ///il cautam binar pe t
{
int st=0, dr=NMAX, t=dr;
while(st<=dr)
{
int mij=st+(dr-st)/2;
if(posibil(mij, n, l))
{
t=mij;
dr=mij-1;
}
else
{
st=mij+1;
}
}
return t;
}
int main()
{
int n, l;
in >> n >> l;
for(int i=1; i<=n; i++)
{
in >> timp_a[i] >> timp_b[i];
}
int ans=cautare_binara(n, l); ///raspunsul cerut
out << ans << "\n";
posibil(ans, n, l);
for(int i=n; i>=1; i--)
{
litri_a[i]=ult_poz[i][l];
litri_b[i]=(ans - litri_a[i]*timp_a[i]) / timp_b[i];
l-=ult_poz[i][l];
}
for(int i=1; i<=n; i++) ///afisam solutia
{
out << litri_a[i] << " " << litri_b[i] << "\n";
}
return 0;
}