Pagini recente » Cod sursa (job #1053520) | Cod sursa (job #457342) | Cod sursa (job #2666835) | Cod sursa (job #260816) | Cod sursa (job #1450231)
#include <cstdio>
#include <algorithm>
using namespace std;
const int Nmax = 100010;
int n , i;
int start[Nmax] , a[Nmax];
long long ans;
long long dp[Nmax];
void divide(int left , int right)
{
if (left >= right)
return;
int mid = (left + right) >> 1;
for (int i = start[left]; i <= mid && i <= start[right]; ++i)
if (1LL * (mid - i + 1) * a[i] + 1LL * (n - mid) * a[mid+1] > dp[mid])
dp[mid] = 1LL * (mid - i + 1) * a[i] + 1LL * (n - mid) * a[mid+1],
start[mid] = i;
divide(left , mid);
divide(mid + 1 , right);
}
int main()
{
freopen("avioane.in","r",stdin);
freopen("avioane.out","w",stdout);
scanf("%d", &n);
for (i = 1; i <= n; ++i)
scanf("%d", &a[i]);
sort(a + 1 , a + n + 1);
/// start[i] = [(start[i] ... i) - economy] [(i + 1 ... n) - business]
start[1] = 0; start[n] = n + 1;
divide(1 , n);
for (i = 1; i <= n; ++i)
ans = max(ans , dp[i]);
printf("%lld\n", ans);
return 0;
}