Cod sursa(job #586479)

Utilizator c_sebiSebastian Crisan c_sebi Data 1 mai 2011 22:02:58
Problema Avioane Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <algorithm>
#include <iostream>

using namespace std;

int a[100001], n;

long long tsearch(int pos, int left, int right){
    //cout << left << " " << right << endl;
    if(left == right){
        return (left - pos + 1) * a[left];
    } else if(left + 1 == right){
        int x = (left - pos + 1) * a[left];
        int y = (right - pos + 1) * a[right];
        return x < y ? y : x;
    }
    else if(left + 2 == right){
        int x = (left - pos + 1) * a[left];
        int y = (right - pos + 1) * a[right];
        int z = (left + 1 - pos + 1) * a[left + 1];
        int m1 = x < y ? y : x;
        return z < m1 ? m1 : z;
    }

    int u = (2*left + right) / 3;
    int v = (left + 2*right) / 3;

    if((u-pos+1) * a[u] < (v-pos+1) * a[v])
        return tsearch(pos, u, right);
    else
        return tsearch(pos, left, v);

}

// Return whether first element is greater than the second
bool UDgreater ( int elem1, int elem2 )
{
   return elem1 > elem2;
}

int main(){
    int i;
    long long pm = 0, p2;
    ifstream f("avioane.in");
    ofstream g("avioane.out");
    f >> n;
    for(i = 0; i < n; i++)
        f >> a[i];
    sort(a, a + n, UDgreater);
    for(i = 0; i < n-1; i++){
        //cout <<
        p2 = tsearch(i+1, i + 1, n-1);
        if((i+1) * a[i] + p2 > pm)
            pm = (i+1) * a[i] + p2;
    }
    g << pm << "\n";
    return 0;
}