Pagini recente » Cod sursa (job #1148929) | Cod sursa (job #137528) | Cod sursa (job #742757) | Cod sursa (job #872751) | Cod sursa (job #854874)
Cod sursa(job #854874)
#include <stdio.h>
#include <string.h>
#include <queue>
#define NMax 110
using namespace std;
const char IN[]="lapte.in",OUT[]="lapte.out";
struct copil{
int x,y;
} v[NMax], R[NMax];
struct point{
int x,y;
} D[NMax][NMax];
int N,L,X,Y;
queue<point> qu[2];
bool test(int T)
{
int i,p=0,a,b,ret=0;
point x={0,0};
while (!qu[0].empty()) qu[0].pop();
while (!qu[1].empty()) qu[1].pop();
qu[0].push(x);
memset(D,0,sizeof(D));
for (i=1;i<=N;++i,p^=1)
{
while (!qu[p].empty())
{
x=qu[p].front();qu[p].pop();
for (a=T/v[i].x;a>=0;--a)
{
b=(T-a*v[i].x)/v[i].y;
point tmp={x.x+a,x.y+b};
if (tmp.x>=NMax) tmp.x=NMax-1;
if (tmp.y>=NMax) tmp.y=NMax-1;
if (!D[tmp.x][tmp.x].x){
D[tmp.x][tmp.y].x=x.x;
D[tmp.x][tmp.y].y=x.y;
qu[p^1].push(tmp);
int r=min(tmp.x,tmp.y);
if (r>ret){
ret=r;
X=tmp.x;Y=tmp.y;
}
}
}
}
}
return ret>=L;
}
int search()
{
int i,step;
for (step=1;step<NMax;step<<=1);
for (i=NMax;step;step>>=1)
if (i-step>0 && test(i-step))
i-=step;
return i;
}
int main()
{
int i,x,y;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&L);
for (i=1;i<=N;++i)
scanf("%d%d",&v[i].x,&v[i].y);
fclose(stdin);
int Rez=search();
test(Rez);
for (i=N;i>0;--i)
{
R[i].x=X-D[X][Y].x;
R[i].y=Y-D[X][Y].y;
x=X;y=Y;
X=D[x][y].x;
Y=D[x][y].y;
}
freopen(OUT,"w",stdout);
printf("%d\n",Rez);
for (i=1;i<=N;++i)
printf("%d %d\n",R[i].x,R[i].y);
fclose(stdout);
return 0;
}