Pagini recente » Cod sursa (job #479990) | Cod sursa (job #1151852) | Cod sursa (job #139009) | Cod sursa (job #1293578) | Cod sursa (job #587247)
Cod sursa(job #587247)
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
#define Nmax 100010
struct stiva {
long long st, dr;
long long p;
} S[Nmax];
int n;
long long v[Nmax];
void rezolva () {
int N = 0;
S[++N].p = 1; S[N].st = 1; S[N].dr = n;
long long i, j, k;
for (i = 2; i <= n; i++) {
k = (i - S[N].p + 1 ) * v[ S[N].p ] - v[i];
if (k <= 0)
k = i;
else
if (v[i] - v[ S[N].p ] != 0) k = i + k / (v[i] - v[ S[N].p ]) + 1;
else k = n + 1;
k++;
while (k <= n && k <= S[N].st) {
S[N].p = i;
S[N].dr = n;
N--;
if (!N) break;
k = (i - S[N].p + 1 ) * v[ S[N].p ] - v[i];
if (k <= 0)
k = i;
else
if (v[i] - v[ S[N].p ] != 0) k = i + k / (v[i] - v[ S[N].p ]) + 1;
else k = n + 1;
k++;
}
if (k > n || N == 0) {
if (S[N + 1].p == i) N++;
}
else {
S[N].dr = k-1;
S[++N].p = i;
S[N].st = k; S[N].dr = n;
}
}
long long sol = 0, cst;
for (i = 1; i <= N; i++)
for (j = S[i].st; j <= S[i].dr; j++) {
cst = v[j] * (n - j + 1) + v[ S[i].p ] * (j - S[i].p);
if (sol < cst) sol = cst;
}
printf ("%lld\n", sol);
}
int main () {
freopen ("avioane.in", "r", stdin);
freopen ("avioane.out", "w", stdout);
scanf ("%d", &n);
for (int i = 1; i <= n; i++)
scanf ("%lld", &v[i]);
sort (v + 1, v + n + 1);
rezolva ();
return 0;
}