Pagini recente » Cod sursa (job #1108139) | Cod sursa (job #1048945) | Cod sursa (job #1854180) | Cod sursa (job #402416) | Cod sursa (job #1224285)
#include<fstream>
#include<algorithm>
#include<cmath>
using namespace std;
const int NM = 100005;
const long long INF = 1111111111111111LL;
const long double eps = 1e-12;
long long a[NM], mx[NM];
long long mom[NM];
int ind[NM];
int N;
int main(){
ifstream cin("avioane.in");
ofstream cout("avioane.out");
int i;
cin >> N;
for(i=1;i<=N;++i) cin >> a[i];
sort(a+1,a+N+1);
long long SMAX = 1LL * a[1] * N, Sum = 0;
int last=1,vv;
last=1;
mx[1] = a[1];
long long inter, now=1111111111111111LL;
for(i=2;i<=N;++i)
{
if(i == 8)
{
i++;
i--;
}
if(mom[i] > 0)
{
if(a[last] * (i - last + 1) <= mom[i])
last = ind[i];
else
{
int j = ind[i];
int l = i+1, r = N, mid;
while(r - l > 1)
{
mid = (l+r) / 2;
if(a[last] * (mid - last + 1) > a[j] * (mid - j+1)) l = mid;
else r = mid;
}
if(a[last] * (l - last + 1) <= a[j] * (l - j+1)) r = l;
if(a[last] * (r - last + 1) <= a[j] * (r - j+1))
{
if(mom[r] < a[j] * (r - j+1) || (mom[r] == a[j] * (r - j+1) && ind[r] < j))
{
mom[r] = a[j] * (r - j+1);
ind[r] = j;
}
}
}
}
if(a[i] >= a[last] * (i - last + 1))
{
last = i;
now = INF;
}
else
if(a[last] != a[i] && i!=N)
{
/*
long double aux = ((long double) (a[last] * (1-last) + a[i] * (i-1)) / (long double) (a[i] - a[last]));
inter = (long long) ceil (aux - eps);
if(now >= inter)
{
now = inter;
vv = i;
}
*/
int l = i+1, r = N, mid;
while(r - l > 1)
{
mid = (l+r) / 2;
if(a[last] * (mid - last + 1) > a[i] * (mid - i+1)) l = mid;
else r = mid;
}
if(a[last] * (l - last + 1) <= a[i] * (l - i+1)) r = l;
if(a[last] * (r - last + 1) <= a[i] * (r - i+1))
{
if(mom[r] < a[i] * (r - i+1) || (mom[r] == a[i] * (r - i+1) && ind[r] < i))
{
mom[r] = a[i] * (r - i+1);
ind[r] = i;
}
}
}
mx[i] = a[last] * (i-last+1);
}
int pzmax;
for(i=2;i<=N;++i)
{
if(mx[i-1] + a[i]*(N-i+1) > SMAX)
{
SMAX = mx[i-1] + a[i]*(N-i+1);
pzmax = i;
}//SMAX = max(SMAX, mx[i-1] + a[i]*(N-i+1));
}
cout << SMAX << '\n';
//cout << pzmax << '\n';
//cout << a[37] * (114-37) + a[114] * (N-114+1) << '\n';
return 0;
}