Pagini recente » Cod sursa (job #2291110) | Cod sursa (job #2132110) | Cod sursa (job #2343636) | Cod sursa (job #3122516) | Cod sursa (job #2654268)
#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;
}