Cod sursa(job #3312973)

Utilizator LucaMirsolea14Luca Mirsolea LucaMirsolea14 Data 1 octombrie 2025 12:20:42
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");

int n, l, a[102], b[102];

int dp[302][302], drum[300][300];

bool Posibil(int t){

    int i, j, x, y, k, x2, a2;

    for(i=0;i<=n;i++)
        for(j=0;j<=l;j++)
         dp[i][j] = -1e9;

    dp[0][0] = 0;

    for(i=1;i<=n;i++){

        for(j=0;j<=l;j++){

            x = (l-j) * a[i];

            for(k=0;k*a[i] <= min(t, x);k++){

                x2 = (t-k* a[i]) / b[i];
                a2 = min(l, j+k);

                dp[i][a2] = max (dp[i][a2], dp[i-1][j] + x2);

            }

        }

    }

    if(dp[n][l] < l)
        return false;
    return true;

}

void Refacere_solutie(int t){

     int i, j, x, y, k, x2, a2;

    for(i=0;i<=n;i++)
        for(j=0;j<=l;j++)
         dp[i][j] = -1e9;

    dp[0][0] = 0;

    for(i=1;i<=n;i++){

        for(j=0;j<=l;j++){

            x = (l-j) * a[i];

            for(k=0;k*a[i] <= min(t, x);k++){

                x2 = (t-k* a[i]) / b[i];
                a2 = min(l, j+k);

                if(dp[i-1][j] + x2 > dp[i][x2]){
                    dp[i][x2] = dp[i-1][j] + x2;
                    drum[i][x2] = j;
                }
            }

        }

    }

}

vector<pair<int,int>> vrez;

void Refacere_drum(int i,int j){
    if(i<1)
        return;
    Refacere_drum(i-1, drum[i][j]);
    fout << j - drum[i][j] << " " << dp[i][j] - dp[i-1][drum[i][j]] << '\n';
}

int main(){

    int i, rez = -1;

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

    int st=1, dr=102, mij;

    while(st <= dr){
        mij = (st+dr)/2;
        if(Posibil(mij)){
            rez = mij;
            dr = mij-1;
        }
        else
            st = mij+1;
    }

    fout << rez << '\n' ;
    Refacere_solutie(rez);
    Refacere_drum(n, l  );

}