Cod sursa(job #585720)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 30 aprilie 2011 11:24:26
Problema Avioane Scor 100
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 5-9 Marime 1.07 kb
#include <stdio.h>

#include <algorithm>

using namespace std;

int n;
int v[100002], poz[100002];
long long solutie, sol[100002];

void calc (int st, int dr)
{
    int i, m = (st + dr) >> 1;

    sol[m] = -2000000000;

    for (i = poz[st - 1]; i <= poz[dr + 1]; i ++)
    {
        if (i > m)
            break;
        if ((m - i + 1) * (long long)v[i] > sol[m])
        {
            sol[m] = (m - i + 1) * (long long)v[i];
            poz[m] = i;
        }
    }

    if (m - 1 >= st)
        calc (st, m - 1);
    if (dr >= m + 1)
        calc (m + 1, dr);
}

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

    scanf ("%d", &n);

    int i;

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

    poz[n + 1] = n;

    calc (1, n);

    for (i = 2; i <= n; i ++)
        if ((n - i + 1) * (long long)v[i] + sol[i - 1] > solutie)
            solutie = (n - i + 1) * (long long)v[i] + sol[i - 1];

    printf ("%lld\n", solutie);
    return 0;
}