Cod sursa(job #1194170)

Utilizator andreeaghetuUNIBUC andreeaghetu andreeaghetu Data 3 iunie 2014 00:54:52
Problema Avioane Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 0.92 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

#define MAX 100100
ifstream in("avioane.in");
ofstream out("avioane.out");


long long v[MAX];
int d[MAX];
int st, dr;

long long cost(int i,int j)
{
    if(v[i]==v[j])
    {
        return MAX;
    }
    return (v[j]*j-v[i]*i)/(v[j]-v[i])+1;
}

int main()
{
    int n;

    in>>n;
    for(int i=1;i<=n;i++)
    {
        in>>v[i];
    }

    sort(v+1, v+n+1);

    long long ans=v[1]*n;

    d[++dr]=1;
    st=1;
    for(int t=2;t<=n;t++)
    {
        while(st<dr && cost(d[st],d[st+1])<=t)
        {
            st++;
        }

        ans=max(ans,(n-t+1)*v[t]+(t-d[st])*v[d[st]]);


        if(v[t]!=v[d[dr]])
        {
            while(st<dr && cost(d[dr-1],t)>cost(d[dr],t) ) {
                dr--;
            }

            d[++dr]=t;
        }
    }

    out<<ans;

    return 0;
}