Cod sursa(job #575472)

Utilizator cdascaluDascalu Cristian cdascalu Data 8 aprilie 2011 12:51:12
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<fstream>
#define INF 0x3f3f3f3f
using namespace std;
int N,L,M[202][202],last[202][202],T;
struct bla
{
	int Ta,Tb;
}v[101];
ofstream g("lapte.out");
int dinamica(int t)
{
	int i,j,k,V;
	last[4][2] = 1;
	memset(last,0,sizeof(last));
	memset(M,0,sizeof(M));
	for(i=0;i<=2*L+2;++i)
		for(j=0;j<=2*L+2;++j)
			M[i][j] = -INF;
	M[0][0] = 0;
	for(i=0;i<=N-1;++i)
		for(j=0;j<=L;++j)
			for(k=0;k<=L;++k)
				if(M[i][j]!=-INF && v[i+1].Ta * k<=t)
				{
					V = (t - v[i+1].Ta*k)/v[i+1].Tb;
					if(M[i+1][j+k] < M[i][j] + V)
					{
						M[i+1][j+k] = M[i][j] + V;
						last[i+1][j+k] = k;
					}
				}
	return (M[N][L] >= L);
}
void drum(int l,int c)
{
	if(!l)return;
	drum(l-1,c-last[l][c]);
	g<<last[l][c]<<" "<<(T-v[l].Ta*last[l][c])/v[l].Tb<<"\n";
}
int main()
{
	ifstream f("lapte.in");
	f>>N>>L;
	int i;
	for(i=1;i<=N;++i)
		f>>v[i].Ta>>v[i].Tb;
	f.close();
	int l=0,r=102,mid,x=0;
	while(l<=r)
	{
		mid = (l+r)/2;
		x = dinamica(mid);
		if(x)
		{
			T = mid;
			r = mid-1;
		}
		else
			l = mid+1;
	}
	x = dinamica(T);
	
	g<<T<<"\n";
	drum(N,L);
	g.close();
	return 0;
}