Cod sursa(job #478508)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 18 august 2010 22:28:50
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<iostream>
#include<cstring>
#include<fstream>

using namespace std;

int beau[101][101],n,l;
int a[100],b[100];

int is_ok(int T)
{
	int best1[101],best2[101];
	int dyn[101][101];

	for(int i=0;i<n;i++)
		for(int j=0;j<=l;j++)
		{
			//best1[i]=-1;
			//best2[i]=-1;
			dyn[i][j]=-1;
		}
	for(int i=0;i<=T/a[0];i++)
	{
		//best1[i]=(T-i*a[0])/b[0];	
		dyn[0][i]=(T-i*a[0])/b[0];
		beau[0][i]=i;
	}

	for(int i=1;i<n;i++)
	{
		for(int j=0;j<=l;j++)
		{
			for(int k=0;k<=T/a[i];k++)
			{
				if(j-k>=0 && dyn[i-1][j-k]>=0)
				{
					int rap=(T-k*a[i])/b[i];
					int nr=dyn[i-1][j-k]+rap;
					if(nr>dyn[i][j])
					{
						dyn[i][j]=nr;
						beau[i][j]=k;
					}
				}
			}
		}
		//for(int i=0;i<=l;i++)
			//best1[i]=best2[i];
	}
	if(dyn[n-1][l]>=l)
		return 1;
	return 0;
}

int search()
{
	int left=0,right=100,rez;

	while(left<=right)
	{
		int mij=left+(right-left)/2;
		if(is_ok(mij))
		{
			right=mij-1;
			rez=mij;
		}
		else
			left=mij+1;
	}
	return rez;
}

void write_sol(int tmin)
{
	ofstream out("lapte.out");
	int lapteA[100],lapteB[100];

	is_ok(tmin);
	int cant=l;
	for(int i=n-1;i>=0;i--)
	{
		lapteA[i]=beau[i][cant];
		lapteB[i]=(tmin-beau[i][cant]*a[i])/b[i];
		cant-=beau[i][cant];
	}
	out<<tmin<<"\n";
	for(int i=0;i<n;i++)
		out<<lapteA[i]<<" "<<lapteB[i]<<"\n";
	out.close();
}

int main()
{
	ifstream in("lapte.in");
	
	in>>n>>l;
	for(int i=0;i<n;i++)
		in>>a[i]>>b[i];
	in.close();
	
	int tmin=search();
	write_sol(tmin);
}