Cod sursa(job #83869)

Utilizator stef2nStefan Istrate stef2n Data 12 septembrie 2007 02:02:03
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>
#include <cstring>

#define NMAX 105

int N,L,TT=101;
short int A[NMAX],B[NMAX];
short int best[NMAX][NMAX];
short int last[NMAX][NMAX];
short int sol[NMAX][NMAX];

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

int verif(int T)
{
	int i,j,k,max;
	for(i=0;i<N;i++)
		for(j=0;j<=L;j++)
		{
			best[i][j]=0;
			last[i][j]=-1;
			for(k=0;(k<=j)&&(k*A[i]<=T);k++)
			{
				if(i==0)
				{
					max = 0;
					if(k==j)
						max += (T-j*A[i])/B[i];
				}
				else
				{
					max = best[i-1][j-k];
					max += (T-k*A[i])/B[i];
				}
				if(best[i][j]<max)
				{
					best[i][j]=max;
					last[i][j]=k;
				}
			}
		}
	if(best[N-1][L]>=L)
	{
		if(TT>T)
		{
			TT=T;
			memcpy(sol,last,sizeof(last));
		}
		return true;
	}
	else
		return false;
}

int binsearch(int li, int ls)
{
	if(li>ls)
		return -1;
	if(verif((li+ls)/2))
	{
		int aux=binsearch(li,(li+ls)/2-1);
		return (aux==-1)?(li+ls)/2:aux;
	}
	else
		return binsearch((li+ls)/2+1,ls);
}

void write_sol(int N, int L)
{
	if(N>0)
		write_sol(N-1,L-sol[N][L]);
	printf("%d %d\n",sol[N][L],(TT-sol[N][L]*A[N])/B[N]);
}


int main()
{
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	read_data();
	printf("%d\n",binsearch(1,100));
	write_sol(N-1,L);

	return 0;
}