Cod sursa(job #2751293)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 14 mai 2021 18:31:34
Problema Lapte Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <iostream>
#include <fstream>

#define NMAX 200
#define LMAX 100
#define INFINIT 10000

using namespace std;

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

int N, L;
int rsp[NMAX + 1][LMAX + 1];

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

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

int valid(int TIMP){
    for(int i = 0; i <= N; i++){
        for(int cantA = 0; cantA <= L; cantA++){
            rsp[i][cantA] = -INFINIT;
        }
    }

    rsp[0][0] = 0;
    for(int i = 1; i <= N; i++){
        for(int cantA = 0; cantA <= L; cantA++){
            for(int cantAadd = 0; cantAadd <= cantA && cantAadd * timp[i].A <= TIMP; cantAadd++){
                int cantBadd = (TIMP - cantAadd * timp[i].A) / timp[i].B;

                int candidat = rsp[i - 1][cantA - cantAadd] + cantBadd;

                if(candidat > rsp[i][cantA]){
                    rsp[i][cantA] = candidat;

                    for(int k = 1; k <= i - 1; k++){
                        cantitate[k][cantA].A = cantitate[k][cantA - cantAadd].A;
                        cantitate[k][cantA].B = cantitate[k][cantA - cantAadd].B;
                    }

                    cantitate[i][cantA].A = cantAadd;
                    cantitate[i][cantA].B = cantBadd;
                }
            }
        }
    }

    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 = 100 * 100 + 1;
    while(right - left > 1){
        int mid = (left + right) / 2;

        if( valid(mid) ){
            right = mid;
        }
        else {
            left = mid;
        }
    }

    //raspunsul se afla in right
    fout << right << "\n";

    valid(right);

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

    return 0;
}