Cod sursa(job #3313115)

Utilizator LucaMirsolea14Luca Mirsolea LucaMirsolea14 Data 2 octombrie 2025 10:58:27
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");

const int inf = 1e9;

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] = -inf;

    dp[0][0] = 0;

    for(j=0;j<=l && j*a[1] <= t;j++){
        dp[1][j] = (t-j*a[1]) / b[1];
    }

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

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

           for(k=0;k<=j;k++){
                if(dp[i-1][k] != -inf &&(j-k)*a[i] <=t)
                    dp[i][j] = max(dp[i][j],dp[i-1][k] + ( (t-(j-k)*a[i]) / b[i] ) );
            }

        }

    }

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

}

void Refacere_drum(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] = -inf;

    dp[0][0] = 0;

    for(j=0;j<=l && j*a[1] <= t;j++){
        dp[1][j] = (t-j*a[1]) / b[1];
    }

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

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

           for(k=0;k<=j;k++){
                if(dp[i-1][k] != -inf &&(j-k)*a[i] <=t)
                    if(dp[i][j] < dp[i-1][k] + ( (t-(j-k)*a[i]) / b[i] )){
                        dp[i][j] = dp[i-1][k] + ( (t-(j-k)*a[i]) / b[i] );
                        drum[i][j] = k;
                    }
            }

        }

    }

}


void Refacere_sol(int lin, int col) {
    if (lin == 0) return;

    int prev = drum[lin][col];
    Refacere_sol(lin - 1, prev);

    int cant = col - prev;
    int transp = (dp[lin][col] - dp[lin - 1][prev]);

    fout << cant << " " << transp << '\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=100, mij;

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

    fout << rez << '\n' ;

    Refacere_drum(rez);
    Refacere_sol(n,l);


}