Cod sursa(job #1393214)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 19 martie 2015 10:39:21
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 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[dim][dim*dim],v[dim][2],sol,bst[dim][dim*dim],lim,lim2,poz;
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;
    }
    for(i=l;i<=lim;++i)
        if(bst[n][poz]<=bst[n][i])
            poz=i;
    if(bst[n][poz]>=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;
        poz=l;
        if(verif(mij))
        {
            dr=mij-1;
            sol=mij;
        }
        else
            st=mij+1;
        memset(bst,0,sizeof(bst));
    }
    fout<<sol<<'\n';
    verif(sol);
    drum(n,poz);
    return 0;
}