Cod sursa(job #549779)

Utilizator bora_marianBora marian bora_marian Data 8 martie 2011 22:15:04
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<fstream>
#include<vector>
using namespace std;
int a[103][103],n,L,sol=102,solu[103][103];
vector<pair<int,int> >v[104];
int verifica(int t);
void solve(int st,int dr);
int rec[102][102],afis[103][3];
void afisare();
ofstream fout("lapte.out");
int main()
{
	ifstream fin("lapte.in");
	fin>>n>>L;
	int i,c,d;
	for(i=1;i<=n;i++)
	{
		fin>>c>>d;
		v[i].push_back(make_pair(c,d));
	}
	
	solve(1,100);
	fout<<sol<<endl;
	afisare();
	return 0;
}
void solve(int st,int dr)
{
	if(st==dr)
	{
		if(verifica(st)==1 && st<sol)
		  sol=st;
		return ;
	}
	else
	{
		int mij=(st+dr)/2;
		int pres=verifica(mij);
		if(pres==1)
		{
		  sol=mij;
		  solve(st,mij);
	    }
		else
		  solve(mij+1,dr);
	 }
}
int verifica(int t)
{
	int i,j,k;
	for(i=0;i<=n;i++)
	   for(j=0;j<=L;j++)
	      a[i][j]=-1;
    a[0][0]=0;
    for(i=1;i<=n;i++)
		for(j=0;j<=L;j++)
			for(k=0;k<=t/v[i][0].first;k++)
			   if(j-k>=0 && a[i-1][j-k]!=-1&& a[i][j]<a[i-1][j-k]+(t-k*v[i][0].first)/v[i][0].second)
			   {
                  a[i][j]=a[i-1][j-k]+(t-k*v[i][0].first)/v[i][0].second;
                  solu[i][j]=k;
				}
	if(a[n][L]>=L)
	{
	  for(i=1;i<=n;i++)
	     for(j=1;j<=L;j++)
	         rec[i][j]=solu[i][j];
	  return  1;
     }
	else
	  return 0;   		
}
void afisare()
{
	int l=L,i;
	for(i=n;i>=1;i--)
	{
	    afis[i][0]=rec[i][l];
	    afis[i][1]=a[i][l]-a[i-1][l-rec[i][l]];
	    l=l-rec[i][l];
	}
	for(i=1;i<=n;i++)
	   fout<<afis[i][0]<<" "<<afis[i][1]<<endl;
}