Pagini recente » Cod sursa (job #2447684) | Cod sursa (job #2049378) | Cod sursa (job #3165987) | Cod sursa (job #541312) | Cod sursa (job #1736916)
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int nmx = 102;
int n,lapte;
int a[nmx],b[nmx];
void citire()
{
scanf("%d %d", &n, &lapte);
for(int i = 1; i <= n; ++i)
scanf("%d %d", &a[i], &b[i]);
}
int timp_gasit,bg[nmx][nmx],nra[nmx],nrb[nmx];
int bou[nmx][nmx];
int dp[nmx][nmx];
int dpp[nmx][nmx];
int dinamica(int t)
{
memset(dp,0,sizeof(dp));
memset(bou,0,sizeof(bou));
for(int j = 0; j <= lapte; ++j)
dp[1][j] = t - j;
for(int i = 2; i <= n; ++i)
for(int j = 0; j <= lapte; ++j)
for(int l = 0; l <= lapte; ++l)
{
if(j - l >= 0 && l*a[i] <= t && dp[i][j] < dp[i-1][j-l])
{
dp[i][j] = dp[i-1][j-l];
bou[i][j] = l;
}
if(l*b[i] <= t && dp[i][j] < dp[i-1][j] + l)
{
dp[i][j] = dp[i-1][j]+l;
bou[i][j] = 0;
}
}
//for(int i = 1; i <= n; ++i)
//for(int i = 1; i <= n; ++i)
if(dp[n][lapte] >= lapte)
return 1;
return 0;
}
void copiaza(int t)
{
timp_gasit = t;
for(int i = 0; i < nmx; ++i)
for(int j = 0; j < nmx; ++j)
{
bg[i][j] = bou[i][j];
dpp[i][j] = dp[i][j];
}
}
void cautare_binara()
{
int st = 1, dr = lapte, mij;
while(st <= dr)
{
mij = (st + dr) / 2;
if(dinamica(mij))
{
dr = mij - 1;
copiaza(mij);
}
else
st = mij + 1;
}
}
void calcul()
{
int i = n, j = lapte;
while(i > 1)
{
if(bg[i][j]) /// a baut a
{
nra[i] += bg[i][j];
j -= bg[i][j];
-- i;
}
else /// a baut b
{
nrb[i] += dp[i][j] - dp[i-1][j];
-- i;
}
}
nra[1] = j;
nrb[1] = dpp[1][j];
for(int i = 1; i <= n; ++i)
{
int timp = nra[i] * a[i] + nrb[i] * b[i];
if(a[i] < b[i])
{
while(timp + a[i] <= timp_gasit)
{
++ timp;
++ nra[i];
}
while(timp + b[i] <= timp_gasit)
{
++ timp;
++ nrb[i];
}
}
else
{
while(timp + b[i] <= timp_gasit)
{
++ timp;
++ nrb[i];
}
while(timp + a[i] <= timp_gasit)
{
++ timp;
++ nra[i];
}
}
}
}
void afish()
{
printf("%d\n", timp_gasit);
for(int i = 1; i <= n; ++i)
printf("%d %d\n", nra[i], nrb[i]);
}
int main()
{
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
citire();
cautare_binara();
calcul();
afish();
return 0;
}