Cod sursa(job #1539760)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 1 decembrie 2015 15:50:01
Problema Avioane Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <algorithm>

#define DIM 100010
#define INF 1000000000
using namespace std;

int N, V[DIM], D[DIM], P[DIM], maxim;

void get_answer (int left, int right) {
/**
 *
 * Calculam D[left+(right-left)/2] in functie de [left->middle|right]
 * i <= middle deoarece nu pot avea economy > business ( eu fixez business si caut economy )
 *
**/
    if (left > right)
        return;
    int middle = left + (right - left) / 2;

    for (int i = P[left - 1]; i <= P[right + 1] && i <= middle; i ++) {
        if (D[middle] < V[middle] * (N - middle + 1) + V[i] * (middle - i)) {
            D[middle] = V[middle] * (N - middle + 1) + V[i] * (middle - i);
            P[middle] = i;
        }
    }

    get_answer (left , middle - 1);
    get_answer (middle + 1, right);

    return;
}

int main () {

    freopen ("avioane.in" ,"r", stdin );
    freopen ("avioane.out","w", stdout);

    scanf ("%d", &N);
    for (int i = 1; i <= N; i ++)
        scanf ("%d", &V[i]);

    sort (V + 1, V + N + 1);
    P[0] = 1; P[N + 1] = N;

    get_answer (1, N);

    for (int i = 1; i <= N; i ++)
        maxim = max (maxim, D[i]);

    printf ("%d\n", maxim);

    return 0;
}