Cod sursa(job #1534208)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 23 noiembrie 2015 15:25:03
Problema Avioane Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>

#define INF (1 << 30)
#define LLINF (1LL << 62)
#define mod 666013

using namespace std;

typedef long long LL;

LL n, i, sol, mx;
LL v[100005];

LL ternary(LL st, LL dr, LL val)
{
    if(st > dr)
        return 0;

    if(st == dr)
    {
        return (v[st] - val) * (n - st + 1);
    }
    if(st == dr - 1)
    {
        LL mij1 = st;
        LL mij2 = dr;
        return max((v[mij1] - val) * (n - mij1 + 1), (v[mij2] - val) * (n - mij2 + 1));
    }

    LL mij1 = st + (dr - st) / 3;
    LL mij2 = st + ( 2 * (dr - st) ) / 3;

    if( (v[mij1] - val) * (n - mij1 + 1) > (v[mij2] - val) * (n - mij2 + 1) )
        return max( ternary(st, mij2 - 1, val), (v[mij1] - val) * (n - mij1 + 1) );
    else
        return max( ternary(mij1 + 1, dr, val), (v[mij2] - val) * (n - mij2 + 1) );
}

int main()
{
    freopen("avioane.in", "r", stdin);
    freopen("avioane.out", "w", stdout);

    scanf("%lld", &n);
    for(i = 1; i <= n; i++)
        scanf("%lld", &v[i]);
    sort(v + 1, v + n + 1);

    for(i = 1; i <= n; i++)
    {
        sol = v[i] * (n - i + 1);
        sol += ternary(i + 1, n, v[i]);
        mx = max(sol, mx);
    }
    printf("%lld", mx);

    return 0;
}