Cod sursa(job #1515981)

Utilizator andreea_zahariaAndreea Zaharia andreea_zaharia Data 2 noiembrie 2015 16:12:39
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int NMAX = 100010;

int v[NMAX];
int d[NMAX];
int N;

long long castig (int business, int economy) {
    long long rasp;
    rasp =  1LL * (N - business + 1) * v[business] +
            1LL * (business - economy) * v[economy];
    return rasp;
}

void divideEtImpera (int st = 1, int dr = N) {
    if (st > dr) {
        return;
    }

    int mij = (st + dr) / 2;
    for (int i = d[st - 1]; i <= d[dr + 1] && i <= mij; i++) {
        long long tmp = castig (mij, i);
        if (tmp > castig (mij, d[mij])) {
            d[mij] = i;
        }
    }

    divideEtImpera (st, mij - 1);
    divideEtImpera (mij + 1, dr);
}

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);

    d[0] = 1;
    d[N + 1] = N;

    divideEtImpera ();

    long long ANS = 0;
    for (int i = 1; i <= N; i++) {
        if (castig (i, d[i]) > ANS) {
            ANS = castig (i, d[i]);
        }
    }

    printf ("%lld\n", ANS);

    return 0;
}