Cod sursa(job #2332841)

Utilizator mihaimodiMihai Modi mihaimodi Data 31 ianuarie 2019 12:31:46
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <cstring>

using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
struct viteza
{
    int a,b;
}v[101];
struct rezultat
{
    int a,b;
}rez[101];
int st,dr,n,l,sol;
int d[101][101],tata[101][101];
int dinamica(int t)
{
    memset(d,0,sizeof(d));
    memset(tata,0,sizeof(tata));
    for(int i=0;i<=l&&t-i*v[1].a>0;i++)
         d[1][i]=(t-i*v[1].a)/v[1].b;
    for(int i=2;i<=n;i++)
    {

        for(int j=0;j<=l;j++)
        {
            for(int k=0;k<=j;k++)
            {
                if((j-k)*v[i].a<=t)
                if(d[i][j]<d[i-1][k]+(t-(j-k)*v[i].a)/v[i].b)
                {
                    d[i][j]=d[i-1][k]+(t-(j-k)*v[i].a)/v[i].b;
                    tata[i][j]=k;
                }
            }
        }
    }
 return d[n][l];
}
int main()
{
    fin>>n>>l;
    for(int i=1;i<=n;i++)
        fin>>v[i].a>>v[i].b;
    st=1;dr=100;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        int b=dinamica(mij);
        if(b>=l)
        {
            dr=mij-1;
            sol=mij;
        }
        else
            st=mij+1;
    }
    fout<<sol<<'\n';
    dinamica(sol);int x=l;
    for(int i=n;i>=1;i--)
    {
        rez[i].a=l-tata[i][l];
        rez[i].b=d[i][l]-d[i-1][tata[i][l]];
        x=tata[i][l];

    }
    for(int i=1;i<=n;i++)
        fout<<rez[i].a<<' '<<rez[i].b<<'\n';
    return 0;
}