Pagini recente » Cod sursa (job #867348) | Cod sursa (job #958520) | Cod sursa (job #2535848) | Cod sursa (job #500021) | Cod sursa (job #1535689)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 100000 + 10;
long long n , i , p , u , qmax , x;
long long q[nmax] , a[nmax] , b[nmax];
double f(int i , int j)
{
return 1.0 * (q[j] - q[i]) / (j - i);
}
int main()
{
freopen("avioane.in" , "r" , stdin);
freopen("avioane.out" , "w" , stdout);
scanf("%lld" , &n);
for (i = 1 ; i <= n ; ++i)
scanf("%lld" , &a[i]);
sort(a + 1 , a + n + 1);
reverse(a + 1 , a + n + 1);
for (i = 1 ; i <= n ; ++i)
q[i] = a[i] * i;
p = 1 , u = 0;
for (i = 1 ; i <= n ; ++i)
{
while (p < u && f(b[p] , b[p + 1]) >= a[i])
p += 1;
x = max(x , q[b[p]] + (i - b[p]) * a[i]);
if (q[i] > qmax)
{
while (p < u && f(b[u] , i) >= f(b[u - 1] , b[u]))
u -= 1;
b[++u] = i;
qmax = q[i];
}
}
printf("%lld\n" , x);
return 0;
}