Cod sursa(job #2157461)

Utilizator shantih1Alex S Hill shantih1 Data 9 martie 2018 17:20:51
Problema Lapte Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");

int n,l,i,j,x,y,nr,st,dr,mid,v[105][105],f[105][105],r[105];
struct lapte
{   int a,b;   } p[110];

bool timp(int t)
{
	int i,j,h,x,y,id=0,mx=0;
	for(i=1;i<=n;i++)
		for(j=1;j<=l;j++)
			v[i][j]=-1;
	
	v[1][0]=t/p[1].b;
	for(i=1;i<=l;i++)
	{
		x=t-i*p[1].a;
		if(x>=0)	v[1][i]=x/p[1].b;
	}
	for(i=2;i<=n;i++)
	{
		v[i][0]=v[i-1][0]+(t/p[i].b);
		for(j=1;j<=l;j++)
		{
			mx=-1;	id=-1;
			for(h=0;h<=j;h++)
			{
				y=t-(j-h)*p[i].a;
				if(v[i-1][h]>=0&&y>=0)
				{
					x=v[i-1][h]+y/p[i].b;
					if(x>mx)
					{	mx=x;	id=h;	}
				}
			}
			v[i][j]=mx;
			f[i][j]=id;
		}
	}
	if(v[n][l]>=l)	return 1;
	return 0;
}
int main () {
	
	fin>>n>>l;
	for(i=1;i<=n;i++)
		fin>>p[i].a>>p[i].b;
	
	st=1;	dr=200000;
	while(st<=dr)
	{
		mid=st+(dr-st)/2;
		if(timp(mid)==1)	dr=mid-1;
		else	st=mid+1;
	}
	if(timp(mid)==0)	mid++;
	if(timp(mid-1)==1)	mid--;
	timp(mid);
	timp(mid-1);
	
	x=n;	y=l;
	while(x>=1)
	{	r[x]=y;	y=f[x][y];	x--;	}
	
	fout<<mid<<"\n";
	for(i=1;i<=n;i++)
	{
		x=r[i]-r[i-1];
		fout<<x<<" "<<(mid-x)/p[i].b<<"\n";
	}
}