Pagini recente » Cod sursa (job #1159950) | Cod sursa (job #1765737) | Cod sursa (job #2797933) | Cod sursa (job #1884355) | Cod sursa (job #1182306)
#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;
}