Cod sursa(job #1228242)

Utilizator PaueyPaula Nicoleta Gradu Pauey Data 13 septembrie 2014 11:41:31
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

#define FIN 1LL * (1 << 60)
#define MAXN 100000

int N;
int v[MAXN + 5], pos[MAXN + 5];
long long dp[MAXN + 5];

void solve(int left, int right) {
   if(left > right)
      return;
   int mid = (left + right) / 2;
   dp[mid] = -FIN;
   for(int i = pos[left - 1]; i <= pos[right + 1]; ++i) {
       long long sum = 1LL * (mid - i) * v[i] + 1LL * (N - mid + 1) * v[mid];
       if(sum > dp[mid]) {
         dp[mid] = sum;
         pos[mid] = i;
       }
   }
   solve(left, mid - 1);
   solve(mid + 1, right);
}

int main()
{
    ifstream cin("avioane.in");
    ofstream cout("avioane.out");

    long long max_sum = -FIN;

    cin >> N;

    for(int i = 1; i <= N; ++i) {
      cin >> v[i];
    }
    sort(v + 1, v + N + 1);
    pos[0] = 1;
    pos[N + 1] = N;
    solve(1, N);
    for(int i = 1; i <= N; ++i) {
      if(dp[i] > max_sum)
         max_sum = dp[i];
    }
    cout << max_sum;
    return 0;
}