Pagini recente » Cod sursa (job #2112323) | Cod sursa (job #1122932) | Cod sursa (job #1982694) | Cod sursa (job #680770) | Cod sursa (job #1778730)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define INF 2000000000
#define MaxN 105
using namespace std;
FILE *IN,*OUT;
int N,L,T,OX,OY,otx,oty;
struct _DP
{
bool val;
int Father,A,B;
}Mat[MaxN][MaxN];
struct _Person
{
int A,B;
}v[MaxN],O[MaxN];
bool GetMax(int Time)
{
bool found=false;
memset(Mat,0,sizeof Mat);
Mat[0][0].val=true;
for(int k=1;k<=N;k++)
{
for(int i=L;i>=0;i--)
for(int j=L;j>=0;j--)
if(Mat[i][j].val)
{
int X,Y;
X=Time/v[k].A+1;
while(X>0)
{
X--;
Y=(Time-X*v[k].A)/v[k].B;
if(!Mat[i+X][j+Y].val)Mat[i+X][j+Y].val=true,Mat[i+X][j+Y].Father=k,Mat[i+X][j+Y].A=X,Mat[i+X][j+Y].B=Y;
if(i+X>=L&&j+Y>=L&&!found)
{
OX=i+X,OY=j+Y,found=true;
}
}
}
}
return found;
}
int main()
{
IN=fopen("lapte.in","r");
OUT=fopen("lapte.out","w");
fscanf(IN,"%d%d",&N,&L);
for(int i=1;i<=N;i++)
fscanf(IN,"%d%d",&v[i].A,&v[i].B);
int lw=1,hi=100,mid,T;
while(lw<=hi)
{
mid=(lw+hi)>>1;
if(GetMax(mid))
{
T=mid;
hi=mid-1;
}
else lw=mid+1;
}
fprintf(OUT,"%d\n",T);
for(int i=1;i<=N;i++)
fprintf(OUT,"%d %d\n",O[i].A,O[i].B);
return 0;
}