Pagini recente » Cod sursa (job #1409693) | Cod sursa (job #1883313) | Cod sursa (job #386327) | Cod sursa (job #2135792) | Cod sursa (job #1774850)
#include <cstdio>
#define NMax 100
int fiu[NMax+1][NMax+1][3];
int F[NMax+1][NMax+1][2];
int A[2][NMax+1][3];
int sol[NMax+1][2];
int is[2][NMax+1];
int x[NMax+1];
int y[NMax+1];
int N,L,T,q;
void Write()
{
int i,x,y,z,aux;
printf("%d\n",T);
for(i = L; i <= NMax; ++i)
if( A[q][i][0] >= L ) { z = i; break; }
x = A[q][z][1];
y = A[q][z][2];
while(x)
{
sol[x][0] = F[x][y][0];
sol[x][1] = F[x][y][1];
aux = x;
x = fiu[z][x][0];
y = fiu[z][aux][1];
z = fiu[z][aux][2];
}
for(i = 1; i <= N; ++i)
printf("%d %d\n", sol[i][0], sol[i][1] );
}
void Set_all()
{
int i,j,k;
for(i = 1; i <= NMax; ++i)
for(j = 1; j <= NMax; ++j)
for(k = 0; k < 3; ++k) fiu[i][j][k] = 0;
for(i = 0; i < 2; ++i )
for(j = 0; j <= NMax; ++j)
for(k = 0; k < 3; ++k) A[i][j][k] = 0;
for(i = 0; i < 2; ++i)
for(j = 0; j <= NMax; ++j) is[i][j] = 0;
}
bool is_good(int T)
{
int i,j,k,a,b,t,l;
Set_all();
for(i = 1; i <= N; ++i)
{
for(t = 0, j = 0; x[i] * j <= T; ++j)
{
F[i][++t][0] = j;
F[i][t][1] = ( T - x[i]*j ) / y[i];
}
F[i][0][0] = t;
}
is[0][0] = is[1][0] = 1;
for(l = 0, i = 1; i <= N; ++i, l = 1-l)
for(j = 1; j <= F[i][0][0]; ++j)
{
a = F[i][j][0];
b = F[i][j][1];
for(k = NMax-a; k >= 0; --k)
if( is[l][k] )
{
if( !is[1-l][k+a] || A[1-l][k+a][0] < A[l][k][0] + b )
{
fiu[k+a][i][0] = A[l][k][1];
fiu[k+a][i][1] = A[l][k][2];
fiu[k+a][i][2] = k;
A[1-l][k+a][0] = A[l][k][0] + b;
A[1-l][k+a][1] = i;
A[1-l][k+a][2] = j;
is[1-l][k+a] = 1;
}
}
}
for(i = L; i <= NMax; ++i)
if( A[l][i][0] >= L ) { q = l; return 1; }
return 0;
}
int main(){
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
int i,st,dr,mid;
scanf("%d %d",&N,&L);
for(i = 1; i <= N; ++i) scanf("%d %d",&x[i],&y[i]);
for(st = 1, dr = NMax; st <= dr; )
{
mid = (st+dr)/2;
if( is_good(mid) ) { T = mid; dr = mid - 1; }
else st = mid + 1;
}
is_good(T);
Write();
return 0;
}