Pagini recente » Cod sursa (job #2636629) | Cod sursa (job #2036181) | Cod sursa (job #1275848) | Cod sursa (job #2803945) | Cod sursa (job #1539762)
#include <cstdio>
#include <algorithm>
#define DIM 100010
#define INF 1000000000
using namespace std;
int N, V[DIM], P[DIM];
long long D[DIM], maxim;
void get_answer (int left, int right) {
/**
*
* Calculam D[left+(right-left)/2] in functie de [left->middle|right]
* i <= middle deoarece nu pot avea economy > business ( eu fixez business si caut economy )
*
**/
if (left > right)
return;
int middle = left + (right - left) / 2;
for (int i = P[left - 1]; i <= P[right + 1] && i <= middle; i ++) {
if (D[middle] < V[middle] * 1LL * (N - middle + 1) + V[i] * 1LL * (middle - i)) {
D[middle] = V[middle] * 1LL * (N - middle + 1) + V[i] * 1LL * (middle - i);
P[middle] = i;
}
}
get_answer (left , middle - 1);
get_answer (middle + 1, right);
return;
}
int main () {
freopen ("avioane.in" ,"r", stdin );
freopen ("avioane.out","w", stdout);
scanf ("%d", &N);
for (int i = 1; i <= N; i ++)
scanf ("%d", &V[i]);
sort (V + 1, V + N + 1);
P[0] = 1; P[N + 1] = N;
get_answer (1, N);
for (int i = 1; i <= N; i ++)
maxim = max (maxim, D[i]);
printf ("%lld\n", maxim);
return 0;
}