Pagini recente » sesiune_igorjeana | Cod sursa (job #419171) | Cod sursa (job #3212634) | Cod sursa (job #1959663) | Cod sursa (job #585819)
Cod sursa(job #585819)
using namespace std;
#include<fstream>
#include<algorithm>
#define DIM 8192
#define ll long long
char vec[DIM];
int pz;
const int MAX_N = 100007;
int A[MAX_N], N;
ll sol;
int best[MAX_N];/*
void cit(int &x)
{
x=0;
while(vec[pz]<'0' || vec[pz]>'9')
if(++pz==DIM) fread(vec,1,DIM,stdin),pz=0;
while(vec[pz]>='0' && vec[pz]<='9')
{
x=x*10 + vec[pz]-'0';
if(++pz==DIM) fread(vec, 1, DIM, stdin),pz=0;
}
}*/
ll get( int j, int i )
{
return 1LL * A[j] * (i - j );
}
int main()
{
//freopen("avioane.in","r",stdin); freopen("avioane.out","w",stdout);
int i, k , avans;
ll p;
//cit(N);
ifstream in("avioane.in"); ofstream out("avioane.out");
in>> N;
for(i = 1; i <= N; ++i) in >> A[i];
//cit( A[i] );
sort( A + 1, A + N + 1 );
int b = 0;
for(i = 1; i <= N; ++i )
{
p = get(b, i) + A[i] * ( N - i + 1 );
if( A[i] != A[i-1] && sol < p )
sol = p;
avans = i - b;
if( A[i] != A[b] ) k = ( A[b] * avans ) / ( A[i] - A[b] );
else k = -1;
if( k >= 0 && i + k <= N )
{
if( !best[ i+k ] ) best[ i + k ] = i;
else
{
int bs = best[i + k];
if( 1LL*A[i] * (k + 1) >= 1LL* A[bs] * ( i + k - bs + 1 ) )
best[ i + k ] = i;
}
}
if( best[i] )
if( get( best[i], 1 + i ) >= get ( b, 1 + i ) ) b = best[i];
}
out << sol << "\n";
return 0;
}