Cod sursa(job #1228315)

Utilizator dariusdariusMarian Darius dariusdarius Data 13 septembrie 2014 18:13:31
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;
const int MAX_N = 100005;

int n, a[MAX_N];
int d[MAX_N];

inline void solve(int st, int dr) {
    if(st > dr) {
        return;
    }
    int mid = (st + dr) / 2;
    d[mid] = d[st - 1];
    for (int i = d[st - 1] + 1; i <= d[dr + 1]; ++ i) {
        if (1LL * (mid - d[mid]) * a[d[mid]] < 1LL * (mid - i) * a[i]) {
            d[mid] = i;
        }
    }
    solve(st, mid - 1);
    solve(mid + 1, dr);
}

int main() {
    ifstream fin("avioane.in");
    ofstream fout("avioane.out");
    fin >> n;
    for (int i = 1; i <= n; ++ i) {
        fin >> a[i];
    }
    sort(a + 1, a + n + 1);
    d[0] = 1; d[n + 1] = n;
    solve(1, n);

    long long max_sum = 0;
    for (int i = 1; i <= n; ++ i) {
        max_sum = max(max_sum, 1LL * (i - d[i]) * a[d[i]] + 1LL * (n - i + 1) * a[i]);
    }
    fout << max_sum << "\n";

    return 0;
}