Cod sursa(job #2402140)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 10 aprilie 2019 13:10:41
Problema Fabrica Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <fstream>
#include <queue>
#define DIM 1002

using namespace std;

ifstream in ("fabrica.in");
ofstream out("fabrica.out");

int n, nrA, nrB;
int A[DIM], B[DIM];
vector<int> solA, solB;

bool takenA, takenB;

struct bere{
    int t;//0 - A, 1 - B
    int index;
   
};

class cmp{
public:
    bool operator() (bere a, bere b){
        if(a.t == b.t)
            return a.index > b.index;
        return a.t > b.t;
    }
};

priority_queue<bere, vector<bere>, cmp> hA, hB;
queue<int> freeA, freeB;

bool cmp(int a, int b){
    return a > b;
}

int main(int argc, const char * argv[]) {
    
    in>>n>>nrA>>nrB;
    for(int i = 1; i <= nrA; ++ i){
        in>>A[i];
        freeA.push(i);
    }
    sort(A + 1, A + nrA + 1);
    for(int i = 1; i <= nrB; ++ i){
        in>>B[i];
        freeB.push(i);
    }
    sort(B + 1, B + nrB + 1);
    int T = 0;
    int maxT = -1;
    for(int i = 1; i <= n; ++ i){
        if(!freeA.empty()){
            hA.push({T + A[freeA.front()], freeA.front()});
            freeA.pop();
        }
        else{
            if(hA.top().t > T)
                T = hA.top().t;
            solA.push_back(T);
            int index = hA.top().index;
            hA.pop();
            hA.push({T + A[index], index});
        }
    }
    
    T = 0;
    
    while(hA.empty() == 0){
        solA.push_back(hA.top().t);
        hA.pop();
    }
    
    for(int i = 1; i <= n; ++ i){
        if(!freeB.empty()){
            hB.push({T + B[freeB.front()], freeB.front()});
            freeB.pop();
        }
        else{
            if(hB.top().t > T)
                T = hB.top().t;
            solB.push_back(T);
            int index = hB.top().index;
            hB.pop();
            hB.push({T + B[index], index});
        }
    }
    
    while(hB.empty() == 0){
        solB.push_back(hB.top().t);
        hB.pop();
    }
    
    sort(solA.begin(), solA.end());
    sort(solB.begin(), solB.end(), cmp);
    
    for(int i = 0; i < solA.size(); ++ i){
        maxT = max(maxT, solB[i] + solA[i]);
    }
    
    out<<maxT;
    
    return 0;
}