Cod sursa(job #634589)

Utilizator darrenRares Buhai darren Data 16 noiembrie 2011 18:32:43
Problema Avioane Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cmath>
#include <fstream>
#include <algorithm>
#include <deque>

using namespace std;

int N;
int P[100002], used[100002];
long long maxP[100002];
long long result;

int main()
{
    ifstream fin("avioane.in");
    ofstream fout("avioane.out");

    fin >> N;
    for (int i = 1; i <= N; ++i)
        fin >> P[i];
    sort(P + 1, P + N + 1);

	int maxn = 0;
	
	maxP[1] = P[1];
    for (int i = 2; i <= N; ++i)
    {
		if (P[i] != P[i - 1])
		{
			double when = 1.0 * P[maxn] * (i - maxn) / (P[i] - P[maxn]);
			int iwhen = floor(when);
			
			used[i + iwhen] = i;
			maxP[i + iwhen] = P[i] * (iwhen + 1);
			
			maxn = i;
		}
		
		if (used[i] == 0)
		{
			used[i] = used[i - 1];
			maxP[i] = 1LL * P[used[i - 1]] * (i - used[i - 1] + 1);
		}
	}

	for (int i = N; i >= 1; --i)
		result = max(result, 1LL * P[i] * (N - i + 1) + maxP[i - 1]);

    fout << result;

    fin.close();
    fout.close();
}