Cod sursa(job #2654268)

Utilizator IRadu1529Radu Ionescu IRadu1529 Data 30 septembrie 2020 12:58:28
Problema Avioane Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <vector>
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;

ifstream fin("avioane.in");
ofstream fout("avioane.out");

typedef long long ll;
using VI = vector< int >;

const int N = 1e6;
const ll INF = 2e18;

ll dp[2][1 + N];
VI v(N + 1);
int n;
ll M;

ll cost(int i)
{
    long long int x = (n - i) * v[i + 1];

    return x;
}


void solve(int l, int r, int optl, int optr) {
    if (l > r)
        return;

    int mid = (l + r) / 2;

    int best = 0;

    dp[1][mid] = 0;

    for (int i = optl; i <= min(optr, mid - 1); i++)
    {
        ll c1 = (i + 1) * v[mid - i] + cost(mid);

        if (dp[1][mid] < c1 || dp[1][mid] < dp[0][mid])
        {
            best = i;

            dp[1][mid] = max(c1, dp[0][mid]);

            M = max(M, dp[1][mid]);
        }
    }

    solve(l, mid - 1, optl, best);

    solve(mid + 1, r, best, optr);
}

int main() {

    ios::sync_with_stdio(false);
    fin.tie(0); fout.tie(0);

    fin >> n;

    for (int i = 1; i <= n; i++)
        fin >> v[i];

    sort(v.begin(), v.begin() + n + 1);

    for (int i = 0; i <= n; i++)
        for (int j = 0; j < i; j++)
        {
            int a = i * v[1], b = (j + 1) * v[i - j], c = dp[0][i];

            dp[0][i] = max(c, max(a, b));
        }

    solve(1, n, 0, n);

    fout << M;
}