Cod sursa(job #1393257)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 19 martie 2015 11:22:57
Problema Lapte Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 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][100005],v[105][2],sol,bst[105][100005],lim,lim2;
int verif(int t)
{

    int lim=0,lim2=0;
    for(i=1;i<=n;++i)
    {
        for(j=0;j<=lim2;j++)
        {
            for(k=j;k<=j + t/v[i][0];k++)
            {
                if(k>l)
                {
                    if(bst[i][l] < bst[i-1][j] + (t-(k-j)*v[i][0])/v[i][1])
                    {
                        bst[i][l] = bst[i-1][j] + (t-(k-j)*v[i][0])/v[i][1];
                        b[i][l]=j;
                    }
                }
                else
                    if(bst[i][k] < bst[i-1][j] + (t-(k-j)*v[i][0])/v[i][1])
                    {
                        bst[i][k] = bst[i-1][j] + (t-(k-j)*v[i][0])/v[i][1];
                        b[i][k]=j;
                    }
            }
        }
        lim2+=t/v[i][0];
    }
    if(bst[n][l]>=l)
        return 1;
    return 0;
}
void drum(int i, int j)
{
    if(i>0)
    {
        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;
}