Cod sursa(job #2484092)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 30 octombrie 2019 17:50:12
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
int n,st,dr,m,ans,l;
struct lapte
{
    int a,b;
}v[110];
int d[110][110], TT[110][110];
bool verif(int t)
{
    memset(d, -0x3f, sizeof(d));
    memchr(TT,0,sizeof(TT));
    ///nr maxim de litri de A daca beau j litri de B cu i oameni
    int s=0;
    for(int i=1;i<=n;i++) s+=t/v[i].b;
    if(s<l) return 0;
    for(int i=0;i<=t/v[1].b && i <= l ; i++) {
        d[1][i]=(t-i*v[1].b)/v[1].a;
        TT[1][i] = 0;
    }
    for(int i=2;i<=n;i++)
    {
        for(int j=0;j<=l;j++)
            for(int p=j;p>=0&&t-(j-p)*v[i].b>=0;p--)
               if(d[i-1][p]+(t-(j-p)*v[i].b) / v[i].a>d[i][j])
               {
                   d[i][j]=d[i-1][p]+(t-(j-p)*v[i].b) / v[i].a;
                   TT[i][j]=p;
               }
    }
    if(d[n][l]>=l) return 1;
    return 0;
}
void afisare(int p1,int cat)
{
    if(p1==1) {
        out<<d[1][cat]<<" "<<cat<<'\n';
        return;
    }
    afisare(p1-1,TT[p1][cat]);
    out<<d[p1][cat]-d[p1-1][TT[p1][cat]]<<" "<<cat-TT[p1][cat]<<'\n';
}
int main()
{
    in>>n>>l;
    for(int i=1;i<=n;i++)
        in>>v[i].a>>v[i].b;
    st=0;
    dr=100;
    while(st<=dr)
    {
        m=(st+dr)/2;
        if(verif(m)) dr=m-1;
        else st=m+1;
    }
    out<<st<<'\n';
    verif(st);
    afisare(n,l);
    return 0;
}