Pagini recente » Cod sursa (job #1590772) | Cod sursa (job #1972099) | Cod sursa (job #2316451) | Cod sursa (job #3270047) | Cod sursa (job #2699085)
#include <bits/stdc++.h>
#define NMAX 111111
#define INF 1000000000
using namespace std;
ifstream fi("avioane.in");
ofstream fo("avioane.out");
long long n, A[NMAX], R1[NMAX];
deque<long long> SOL, TIMP;
long long timp(long long p1, long long p2)
/// timpul cand p2 mai profitabil decat p1
{
if(A[p1]==A[p2])return INF;
return p2 + ((p2 - p1) * A[p1] - 1)/(A[p2] - A[p1]) + 1;
}
int main() {
fi >> n;
for(long long i = 1; i <= n; i++)
fi >> A[i];
sort(A + 1, A + n + 1);
SOL.push_back(1);
R1[1] = A[1];
for(long long i = 2; i <= n; i++) {
if(SOL.size() > 1) {
while(SOL.size() > 1 && TIMP.back() >= timp(SOL.back(),i)) {
SOL.pop_back();
TIMP.pop_back();
}
}
TIMP.push_back(timp(SOL.back(),i));
SOL.push_back(i);
while(TIMP.front() <= i){
TIMP.pop_front();
SOL.pop_front();
}
R1[i] = A[SOL.front()] * (i-SOL.front()+1);
}
// for(long long i = 1; i <= n; i++)
// fo << R1[i] << " ";
long long rez = -INF;
for(long long i = 2; i <= n; i++)
rez = max(rez, R1[i-1] + A[i]*(n-i+1));
fo << rez;
return 0;
}