Cod sursa(job #84916)

Utilizator stef2nStefan Istrate stef2n Data 18 septembrie 2007 16:40:25
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>

#define NMAX 105

int N,L,timp=101,poz,solpoz;
short int a[NMAX],b[NMAX];
short int MAX[NMAX][2*NMAX],added[NMAX][2*NMAX];
short int sol[NMAX][2*NMAX];

void read_data()
{
	scanf("%d %d",&N,&L);
	for(int i=1;i<=N;i++)
		scanf("%hd %hd",&a[i],&b[i]);
}

bool verif(int T)
{
	int i,j,tlast;
	for(i=0;i<=N;i++)
		for(j=0;j<=200;j++)
			MAX[i][j]=-1;
	MAX[0][0]=0;
	added[0][0]=-1;
	for(i=1;i<=N;i++)
		for(j=0;j<=200;j++)
			for(tlast=0;(tlast<=T)&&(j-tlast/a[i]>=0);tlast++)
				if(MAX[i-1][j-tlast/a[i]]!=-1 && MAX[i][j]<MAX[i-1][j-tlast/a[i]]+(T-tlast)/b[i])
				{
					MAX[i][j]=MAX[i-1][j-tlast/a[i]]+(T-tlast)/b[i];
					added[i][j]=tlast;
				}
	for(j=L;j<=200;j++)
		if(MAX[N][j]>=L)
		{
			poz=j;
			return true;
		}
	return false;
}

int binary_search(int li, int ls)
{
	if(li>ls)
		return -1;
	if(verif((li+ls)/2))
	{
		if(timp>(li+ls)/2)
		{
			timp=(li+ls)/2;
			solpoz=poz;
			for(int i=0;i<=N;i++)
				for(int j=0;j<=200;j++)
					sol[i][j]=added[i][j];
		}
		int aux=binary_search(li,(li+ls)/2-1);
		return (aux!=-1)?aux:((li+ls)/2);
	}
	else
		return binary_search((li+ls)/2+1,ls);
}

void recursive_solution(int N, int p)
{
	if(N>1)
		recursive_solution(N-1,p-sol[N][p]/a[N]);
	printf("%d %d\n",sol[N][p]/a[N],(timp-sol[N][p])/b[N]);
}


int main()
{
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	read_data();
	binary_search(1,100);
	printf("%d\n",timp);
	recursive_solution(N,solpoz);
	return 0;
}