Pagini recente » Cod sursa (job #201093) | Cod sursa (job #2037087) | Cod sursa (job #804904) | Cod sursa (job #2816964) | Cod sursa (job #1329664)
#include <cstdio>
#include <cstring>
#include <unordered_map>
FILE* in=fopen("lapte.in","r");
FILE* out=fopen("lapte.out","w");
int n,l;
const int Q=107;
int a[Q],b[Q];
int sa[Q*Q];
int frm,sainit;
int ra[Q],rb[Q];
struct doblu{
int val,raval,i;
};
std::unordered_map<int,doblu> map[Q*Q];
int r1,r2;
bool bun2(int t)
{
memset(sa,0,sizeof sa);
// memset(sb,0,sizeof sb);
int g;
int init;
for(int i=1; i<=n; i++)
{
for( g=10000; g>0; g--)
{
if(sa[g]!=0)
{
init=sa[g];
for(int j=0; j*a[i]<=t; j++)
{
if(sa[g+j]<init+((t-j*a[i])/b[i]) )
{
sa[g+j]=init+((t-j*a[i])/b[i]);
map[g+j][sa[g+j] ]=doblu{g,init,i};
if(g+j>=l && sa[g+j]>=l)
{
r1=g+j;
r2=sa[g+j];
return 1;
}
}
}
}
}
init=sa[0];
for(int j=0; j*a[i]<=t; j++)
{
if(sa[j]<((t-j*a[i])/b[i])+init )
{
sa[j]=((t-j*a[i])/b[i])+init;
map[j][sa[j]]=doblu{0,init,i};
if(j>=l && sa[j]>=l)
{
r1=j;
r2=sa[j];
return 1;
}
}
}
}
return 0;
return 0;
}
bool bun(int t)
{
memset(sa,0,sizeof sa);
// memset(sb,0,sizeof sb);
int g;
int init;
for(int i=1; i<=n; i++)
{
for( g=10000; g>0; g--)
{
if(sa[g]!=0)
{
init=sa[g];
for(int j=0; j*a[i]<=t; j++)
{
if(sa[g+j]<init+((t-j*a[i])/b[i]) )
{
sa[g+j]=init+((t-j*a[i])/b[i]);
if(g+j>=l && sa[g+j]>=l)
return 1;
}
}
}
}
init=sa[0];
for(int j=0; j*a[i]<=t; j++)
{
if(sa[j]<((t-j*a[i])/b[i])+init )
{
sa[j]=((t-j*a[i])/b[i])+init;
if(j>=l && sa[j]>=l)
return 1;
}
}
}
return 0;
}
int main()
{
fscanf(in,"%d%d",&n,&l);
for(int i=1; i<=n; i++)
fscanf(in,"%d%d",&a[i],&b[i]);
int p=64,k=0;
while(p)
{
if( !bun(p+k) )
k+=p;
p/=2;
}
fprintf(out,"%d\n",k+1);
bun2(k+1);
int act1=r1,act2=r2,b1,b2,i;
while(act1 ||act2)
{
b1=map[act1][act2].val;
b2=map[act1][act2].raval;
i=map[act1][act2].i;
ra[i]=act1-b1;
rb[i]=act2-b2;
act1=b1;
act2=b2;
}
frm=-1;
for(int i=1; i<=n; i++)
fprintf(out,"%d %d\n",ra[i],rb[i]);
return 0;
}