Cod sursa(job #1204226)

Utilizator andreiiiiPopa Andrei andreiiii Data 2 iulie 2014 13:19:05
Problema Fabrica Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <algorithm>
#include <cstdio>
#include <queue>

using namespace std;

struct comp {
    bool operator()(const pair<int, int> &a, const pair<int, int> &b) const {
        return a.first > b.first;
    }
};

void Solve(vector<int> &Times, const vector<int> &Values)
{
    priority_queue< pair<int, int>, vector< pair<int, int> >, comp> H;

    for (int i = 0; i < int(Values.size()); i++)
        H.push(make_pair(Values[i], Values[i]));

    for (int i = 0; i < int(Times.size()); i++)
    {
        const int time = H.top().first, add = H.top().second;
        H.pop();

        Times[i] = time;
        H.push(make_pair(time + add, add));
    }
}

int main()
{
    freopen("fabrica.in", "r", stdin);
    freopen("fabrica.out", "w", stdout);

    int N, NrA, NrB;
    scanf("%d%d%d", &N, &NrA, &NrB);

    vector<int> ValuesA(NrA);
    for (int i = 0; i < NrA; i++) scanf("%d", &ValuesA[i]);

    vector<int> TimesA(N);
    Solve(TimesA, ValuesA);

    int Ans = 0;
    for (int i = 0; i < N; i++)
        Ans = max(Ans, TimesA[i]);

    printf("%d ", Ans);

    vector<int> ValuesB(NrB);
    for (int i = 0; i < NrB; i++) scanf("%d", &ValuesB[i]);

    vector<int> TimesB(N);
    Solve(TimesB, ValuesB);

    for (int i = 0; i < N; i++)
        Ans = max(Ans, TimesA[i] + TimesB[N - i - 1]);

    printf("%d\n", Ans);
}