Cod sursa(job #1393184)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 19 martie 2015 10:16:54
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <string.h>
#define dim 101
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,l,st,dr,mij,i,j,k,a[dim][dim],b[dim][dim],v[dim][2],sol,bst[dim][dim],lim;
int verif(int t)
{

    for(j=0;j<=t;j++)
        bst[1][j]=(t-j)/v[1][1],b[1][j]=j;
    for(i=2;i<=n;i++)
    {
        lim = t/v[i][0];
        for(j=0;j<=i*t;j++)
        {
            bst[i][j]=bst[i-1][j] + t/v[i][1];
            b[i][j]=j;
            for(k=j-1;k>=(j-lim)&&k>=0;k--)
            {
                if(bst[i][j] < bst[i-1][k] + (t - (j-k)*v[i][0])/v[i][1])
                {
                    bst[i][j] = bst[i-1][k] + (t - (j-k)*v[i][0])/v[i][1];
                    b[i][j]=k;
                }
            }
        }
    }
    if(bst[n][l]>=l)
        return 1;
    return 0;
}
void drum(int i, int j)
{
    if(i==1)
    {
        fout<<j<<' '<<bst[i][j]<<'\n';
        return;
    }
    int k=b[i][j];
    drum(i-1,k);
    fout<<j-k<<' '<<bst[i][j]-bst[i-1][k]<<'\n';
}
int main()
{
    fin>>n>>l;
    for(i=1;i<=n;i++)
        fin>>v[i][0]>>v[i][1];
    st=1;dr=100;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(verif(mij))
        {
            dr=mij-1;
            sol=mij;
        }
        else
            st=mij+1;
        memset(bst,0,sizeof(bst));
    }
    fout<<sol<<'\n';
    verif(sol);
    drum(n,l);
    return 0;
}