Cod sursa(job #854874)

Utilizator crushackPopescu Silviu crushack Data 14 ianuarie 2013 11:15:26
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#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;
}