Cod sursa(job #1393225)

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

    int lim=0,lim2=0;
    for(i=1;i<=n;++i)
    {
        lim += t/v[i][0];
        for(j=0;j<=lim;++j)
        {
            for(k=max(0,(j+lim2-lim));k<=j&&k<=lim2;++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;
                }
            }
        }
        lim2=lim;
    }
    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';
    int d;
    d=verif(sol);
    drum(n,l);
    return 0;
}