Pagini recente » Cod sursa (job #2589798) | Cod sursa (job #525438) | Cod sursa (job #2249332) | Cod sursa (job #2492725) | Cod sursa (job #1702910)
#include <algorithm>
#include <fstream>
#include <cstdio>
#define NMAX 100005
using namespace std;
unsigned int pos[NMAX] , v[NMAX] , dp[NMAX];
unsigned int ans , n;
void solve(unsigned int st , unsigned int dr);
template <class T>
void read(T &x) {
T sign = 1;
char ch;
x = 0;
while(!isdigit(ch = getchar())) {
if(ch == '-') {
sign = -1;
}
else {
sign = 1;
}
}
do {
x = x * 10 + ch - '0';
}while(isdigit(ch = getchar()));
x *= sign;
}
int main() {
freopen("avioane.in" , "r" , stdin);
freopen("avioane.out" , "w" , stdout);
read(n);
for(int i = 1 ; i <= n ; ++i) {
read(v[i]);
}
sort(v + 1 , v + n + 1);
pos[0] = 1 , pos[n + 1] = n;
solve(1 , n);
for(int i = 1 ; i <= n ; ++i) {
ans = max(ans , dp[i]);
}
printf("%u" , ans);
return 0;
}
void solve(unsigned int st , unsigned int dr) {
if(st > dr) {
return;
}
unsigned int mid = st + (dr - st) / 2;
for(int i = pos[st - 1] ; i <= pos[dr + 1] && i <= mid ; ++i) {
unsigned int aux = v[mid] * (n - mid + 1) + v[i] * (mid - i);
if(aux > dp[mid]) {
dp[mid] = aux;
pos[mid] = i;
}
}
solve(st , mid - 1);
solve(mid + 1 , dr);
}