Cod sursa(job #2751037)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 13 mai 2021 22:56:32
Problema Lapte Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.89 kb
#include <iostream>
#include <fstream>
#include <cstring>

#define NMAX 100
#define LMAX 100

using namespace std;

ifstream fin ("lapte.in");
ofstream fout ("lapte.out");

int N, L;
int rsp[NMAX + 1][LMAX * 2 - 2 + 1];
int cantitateFinalaA;

struct persoana{
    int A, B;
}timp[NMAX + 1];

struct repartizare{
    int A, B;
}cantitate[NMAX + 1][LMAX * 2 - 2 + 1];

int valid(int TIMP){
    //reinitializare
    for(int i = 0; i <= N; i++){
        for(int Ca = 0; Ca <= 2 * L - 2; Ca++){
            rsp[i][Ca] = -1;
        }
    }

    //initializare pt i = 1
    for(int Ca = 0; Ca <= 2 * L - 2; Ca++){
        if(TIMP - (Ca * timp[1].A) >= 0){
            rsp[1][Ca] = ( TIMP - Ca * timp[1].A ) / timp[1].B;
            cantitate[1][Ca].A = Ca;
            cantitate[1][Ca].B = (TIMP - Ca * timp[1].A) / timp[1].B;
        }
    }

    /*
    for(int Ca = 0; Ca <= 2 * L - 2; Ca++){
        cout << "rsp[1][ "<< Ca << " ] = " << rsp[1][Ca] << "\n";
    }
    cout << "\n";
    */

    for(int i = 2; i <= N; i++){
        for(int Ca = 0; Ca <= 2 * L - 2; Ca++){
            for(int CaF = Ca; CaF >= 0 && TIMP >= (Ca - CaF) * timp[i].A; CaF--){ //descrescator nu din intamplare!!!! motivul este ca am nevoie ca (Ca - CaF) sa fie crescator in loc de descrescator din cauza modului in care functioneaza conditia
                if(rsp[i - 1][CaF] != -1){
                    /*
                    cout << "rsp[ " << i << " ][ " << Ca << " ] = max ( rsp[ " << i << " ][ " << Ca << " ], rsp[ " << i - 1 << " ][ " << CaF << " ] + (TIMP - " << Ca - CaF << " * " <<
                    timp[i].A << " ) / " << timp[i].B << " ) = max ( " <<
                     rsp[i][Ca] << ", " << rsp[i - 1][CaF]
                     << " + " << (TIMP - (Ca - CaF) * timp[i].A) /
                    timp[i].B << " = "
                    << rsp[i - 1][CaF] + (TIMP - (Ca - CaF) * timp[i].A) / timp[i].B << " ) \n";
                    */

                    int candidat = rsp[i - 1][CaF] + (TIMP - (Ca - CaF) * timp[i].A) / timp[i].B;
                    if(candidat > rsp[i][Ca]){
                        rsp[i][Ca] = candidat;

                        for(int j = 1; j <= i - 1; j++){
                            cantitate[j][Ca].A = cantitate[j][CaF].A;
                            cantitate[j][Ca].B = cantitate[j][CaF].B;
                        }
                        cantitate[i][Ca].A = (Ca - CaF);
                        cantitate[i][Ca].B = (TIMP - (Ca - CaF) * timp[i].A) / timp[i].B;
                    }
                }
            }
        }
    }

    /*
    cout << "TIMP = " << TIMP << "\n";
    for(int i = 1; i <= N; i++){
        for(int Ca = 0; Ca <= 2 * L - 2; Ca++){
            cout << "rsp[ " << i << " ][ " << Ca << " ] = " << rsp[i][Ca] << "\n";
        }
        cout << "\n";
    }
    cout << "\n\n\n";
    */

    /*
    int counter = L;
    while(counter <= 2 * L - 2 && rsp[N][counter] == -1){
        counter++;
    }

    if(counter <= 2 * L - 2){
        cantitateFinalaA = counter; //variabila globala

        return (rsp[N][counter] >= L);
    }
    else {
        return 0;
    }
    */

    cantitateFinalaA = L;
    return (rsp[N][L] >= L);
}

int main()
{
    fin >> N >> L;

    for(int i = 1; i <= N; i++){
        fin >> timp[i].A >> timp[i].B;
    }

    int left = 0;
    int right = 1000 + 1;

    while(right - left > 1){
        int mid = left + (right - left) / 2;

        if( valid(mid) ){
            right = mid;
        }
        else {
            left = mid;
        }
    }
    //raspunsul se afla in right

    fout << right << "\n";

    int aux = valid(right); //ca sa mai apelez o data valid(right) sa formez cantitate[][]

    for(int i = 1; i <= N; i++){
        fout << cantitate[i][cantitateFinalaA].A << ' ' << cantitate[i][cantitateFinalaA].B << "\n";
    }


    return 0;
}