Pagini recente » Cod sursa (job #651345) | Cod sursa (job #263691) | Cod sursa (job #1944948) | Cod sursa (job #1135402) | Cod sursa (job #186484)
Cod sursa(job #186484)
#include<stdio.h>
#define nmax 105
int a[nmax],b[nmax];
int sola[nmax][nmax],solb[nmax][nmax];
int sfa[nmax],sfb[nmax];
inline int max(const int a,const int b)
{
if(a>b)
return a;
return b;
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
int n,l;
scanf("%d %d",&n,&l);
int aux1=-1,aux2=-1,solfin=0,i,j,k;
for(i=0; i<n; ++i){
scanf("%d%d",&a[i],&b[i]);
aux1=max(aux1,a[i]);
aux2=max(aux2,b[i]);
}
int LEVEL=max(aux1,aux2)*l;
int start=0,end=LEVEL;
int tmin,bine;
while( start<=end )
{
tmin=(start+end)/2;
for(i=0; i<nmax; ++i)
for(j=0; j<nmax; ++j){
sola[i][j]=0;
solb[i][j]=-1;
}
for(i=0; i<nmax; ++i)
if( tmin>=i*a[0] )
{
solb[0][i]=(tmin-i*a[0])/b[0];
sola[0][i]=i;
}
for(i=1; i<n; ++i)
for(j=0; j<nmax; ++j)
for(k=0; k<nmax-j; ++k)
if( k*a[i]<=tmin ){
aux1=solb[i-1][j]+(tmin-k*a[i])/b[i];
if( aux1>=solb[i][j+k] && solb[i-1][j]!=-1 )
{
solb[i][j+k]=aux1;
sola[i][j+k]=k;
}
}
bine=0;
for(i=l; i<=nmax; ++i)
if(solb[n-1][i]>=l ){
bine=i; break;}
if( bine )
{
end=tmin-1;
solfin=tmin;
for(i=n-1; i>=0; --i)
{
//printf("(%d)\n",bine);
aux1=sola[i][bine];
sfa[i]=aux1;
sfb[i]=(tmin-aux1*a[i])/b[i];
bine-=aux1;
}
}
else
{
start=tmin+1;
}
// printf("\n\n");
}
//solutie pare corecta desi nu prea corespunde cu exepmlul :D
printf("%d \n",solfin);
for(i=0; i<n; ++i)
printf("%d %d\n",sfa[i],sfb[i]);
return 0;
}