Cod sursa(job #1182263)

Utilizator denisx304Visan Denis denisx304 Data 5 mai 2014 17:17:53
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <climits>
using namespace std;

ifstream f("avioane.in");
ofstream g("avioane.out");

long long n, v[100002], eco[100002],  win[100002];

void find(int left, int right)
{
    if (left <= right)
    {
        long long bus = (left + right) / 2;
        for (int i = eco[left - 1]; i <= min(eco[right + 1], bus); i ++)
            if (v[bus] * (n - bus + 1) + v[i] * (bus - i) > win[bus])
            {
                win[bus] = v[bus] * (n - bus + 1) + v[i] * (bus - i);
                eco[bus] = i;
            }
        find(left, bus - 1);
        find(bus + 1, right);
    }
}

int main()
{
    f >> n;
    for (int i = 1; i <= n; i ++)
        f >> v[i];
    sort(v + 1, v + n + 1);
    long long maxim = INT_MIN;
    eco[0] = 1;
    eco[n + 1] = n;
    find(1, n);
    for (int i = 1; i <= n; i ++)
        if (win[i] > maxim)
            maxim = win[i];
    g << maxim;
    f.close();
    g.close();
    return 0;
}