Cod sursa(job #2333912)

Utilizator YetoAdrian Tonica Yeto Data 2 februarie 2019 09:35:23
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <cstring>
using namespace std;
int n, l, i, j, k, st, dr, b, sol;
struct vect {
    int a, b;
}v[101], rez[101];
int d[101][101], tata[101][101];

int dinamica (int T) {
    for (int i=1;i<=n;i++) {
        for (int j=0;j<=l;j++)
            d[i][j]=-1;
    }
    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 (T-(j-k)*v[i].a>=0) {
                    if (d[i-1][k]!=-1 && 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 () {
    ifstream fin ("lapte.in");
    ofstream fout ("lapte.out");
    fin>>n>>l;
    for (i=1;i<=n;i++) {
        fin>>v[i].a>>v[i].b;
    }

    st=1;
    dr=100;
    while (st<=dr) {
        int mid=(st+dr)/2;
        b=dinamica(mid);
        if (b>=l) {
            sol=mid;
            dr=mid-1;
        }else
            st=mid+1;
    }
    b=dinamica(sol);
    fout<<sol<<"\n";

    k=l;
    for (i=n;i>=1;i--) {
        rez[i].b=d[i][k]-d[i-1][tata[i][k]];
        rez[i].a=k-tata[i][k];
        k=tata[i][k];
    }

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