Pagini recente » Cod sursa (job #1701527) | Cod sursa (job #1855308) | Cod sursa (job #2250057) | Cod sursa (job #1935196) | Cod sursa (job #566570)
Cod sursa(job #566570)
# include<fstream>
# include<string.h>
using namespace std;
# define maxn 102
ifstream f("lapte.in");
ofstream g("lapte.out");
int ca[maxn], cb[maxn], n, l, best[maxn][maxn], from[maxn][maxn], last[maxn][maxn];
int sol;
void citire()
{
int i; f>>n>>l;
for (i=1; i<=n; i++)
f>>ca[i]>>cb[i];
}
int max(int a, int b)
{
if(a>b) return a;
return b;
}
int min(int a, int b)
{
if(a<b) return a;
return b;
}
int verific(int t)
{
int i, j, qa, maxa, aux;
memset(best, 0xff, sizeof(best));
for (maxa=t/ca[1], i=0; i<=maxa; i++)
best[1][i] = ( t - i*ca[1] ) / cb[1];
for (i=2; i<=n; i++)
for (qa=0; qa <= l; qa++)
{
for (j=0, maxa = min(qa, t/ca[i]); j<=maxa; j++)
if ( best[i-1][qa-j] != -1 )
if ( (aux=best[i-1][qa-j] + ( t-j*ca[i] ) / cb[i] ) > best[i][qa] )
best[i][qa] = aux, from[i][qa] = qa-j;
}
return ( best[n][l] >= l );
}
void rezolva()
{
int mina, minb, tmax, t, step, i;
for (mina=ca[1], minb=cb[1], i=2; i<=n; i++)
mina = ca[i] < mina ? ca[i] : mina,
minb = cb[i] < minb ? cb[i] : minb;
tmax = l * mina + l * minb;
for (step=1; step<tmax; step<<=1);
for (t=tmax; step; step>>=1)
if ( t - step >= 1 )
if ( verific(t - step) )
t -= step,
memcpy(last, from, sizeof(from));
sol = t,
memcpy(from, last, sizeof(last));
}
void afisare()
{
int i, act, total=l;
int q[maxn][2];
memset(q, 0, sizeof(q));
for (i=n, act=from[n][l]; i>=1; i--)
q[i][0] = total-act,
total = act,
q[i][1] = ( sol-q[i][0] * ca[i] ) / cb[i],
act = from[i-1][act];
g<<sol<<'\n';
for (i=1; i<=n; i++)
g<<q[i][0]<<' '<<q[i][1]<<'\n';
}
int main()
{
citire();
rezolva();
afisare();
return 0;
}