Cod sursa(job #856199)

Utilizator crushackPopescu Silviu crushack Data 16 ianuarie 2013 00:12:18
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define NMax 110
using namespace std;

const char IN[]="lapte.in",OUT[]="lapte.out";

struct copil{
	int x,y;
} v[NMax], r[NMax];

int N,L,Rez,Rx,Ry;
int D[NMax][NMax], P[NMax][NMax],P2[NMax][NMax];

bool test(int T)
{
	int i,j,k,A=0,x,y,ret=0;
	for (i=1;i<=N;++i)
		A+=T/v[i].x;
	A-=L;
	if (A<0) return false;

	memset(D,0,sizeof(D));
	memset(P,0,sizeof(P));
	memset(P2,0,sizeof(P2));

	for (i=1;i<=N;++i)
		for (j=0;j<=A;++j)
		{
			D[i][j]=D[i-1][j];P[i][j]=0;P2[i][j]=j;
			for (k=0;k<=T/v[i].y;++k){
				y=k;
				x=T/v[i].x-(T-y*v[i].y)/v[i].x;
				if (x+j<=A && D[i][j]<D[i-1][j+x]+y){
					 D[i][j]=D[i-1][j+x]+y;
					 P[i][j]=y;
					 P2[i][j]=j+x;
				}
			}
			if (D[i][j]>=ret){
				ret=D[i][j];
				Rx=i;Ry=j;
				if (ret>=L) return true;
			}
		}

	return ret>=L;
}

int search(int L)
{
	int i,step;
	for (step=1;step<=L;step<<=1);
	for (i=L;step;step>>=1)
		if (i-step>0 && test(i-step))
			i-=step;
	return i;
}

int main()
{
	int i;
	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);

	Rez=search(100);
	test(Rez);

	for (i=N;i>Rx;--i) r[i].x=Rez/v[i].x,r[i].y=0;
	for (;Rx>0;--Rx)
	{
		r[Rx].y=P[Rx][Ry];
		r[Rx].x=(Rez-r[Rx].y*v[Rx].y)/v[Rx].x;
		Ry=P2[Rx][Ry];
	}

	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;
}