Cod sursa(job #2928654)

Utilizator LucapetreMirea Bulubasa Petre Luca Lucapetre Data 23 octombrie 2022 16:50:27
Problema Lapte Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");

int n,l,a[105],b[105],dp[105][105],dpr[105][105],lamax[105];

bool testt(int tmin) {

    for(int i=1;i<=n;i++) {
        lamax[i]=min(lamax[i-1]+tmin/a[i],l);
        for(int lapteA=0;lapteA<=lamax[i];lapteA++) {
            dp[i][lapteA]=0;
            for(int la = 0; la <= min(lapteA,tmin/a[i]);la++)
            {
                int lb=(tmin-la*a[i])/b[i];
                int v2 = dp[i-1][lapteA-la]+lb;
                if(lapteA-la>lamax[i-1]) {
                    v2=0;
                }
                dp[i][lapteA] = max(dp[i][lapteA],v2);
            }
        }
    }

    if(dp[n][l] >= l) {
        return 1;
    }
    return 0;
}

int caut() {
    int st=1,dr=100,mij,r=-1;
    while(st<=dr) {
        mij = (st+dr)/2;
        bool ok = testt(mij);
        if(ok) {
            dr=mij-1;
            r=mij;
            for(int i=1;i<=n;i++) {
                for(int j=0;j<=l;j++) {
                    dpr[i][j]=dp[i][j];
                }
            }
        }

        else st=mij+1;
    }
    return r;
}

int main() {

    fin>>n>>l;

    for(int i=1;i<=n;i++) {
        fin>>a[i]>>b[i];
    }

    int rasp = caut();
    fout<<rasp<<'\n';
    vector<pair<int,int>> ansv(n+1);
    int i=n,lapteA=l;
    while(i>=1) {
        for(int la = 0; la <= min(lapteA,rasp/a[i]);la++) {
            if(la*a[i]+(dpr[i][lapteA]-dpr[i-1][lapteA-la])*b[i]<=rasp) {
                ansv[i]=make_pair(la,dpr[i][lapteA]-dpr[i-1][lapteA-la]);
                i--;
                lapteA-=la;
                break;
            }
        }
    }

    for(int i=1;i<=n;i++){
        fout<<ansv[i].first<<' '<<ansv[i].second<<'\n';
    }
    return 0;
}