Pagini recente » Cod sursa (job #2399668) | Cod sursa (job #2631913) | Cod sursa (job #1074626) | Cod sursa (job #852631) | Cod sursa (job #585728)
Cod sursa(job #585728)
using namespace std;
#include<cstdio>
#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, j, k , avans;
ll p;
cit(N);
for(i = 1; i <= N; ++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] );
if( i + k <= N )
{
if( !best[ i+k ] ) best[ i + k ] = i;
else
{
int bs = i + k;
if( 1LL*A[i] * (k + 1) >= 1LL* A[best[bs]] * ( i + k - best[bs] + 1 ) )
best[i+k] = i;
}
}
if( best[i] )
if( get( best[i], 1 + i ) >= get ( b, 1 + i ) ) b = best[i];
}
printf("%lld\n", sol );
return 0;
}