Cod sursa(job #726977)

Utilizator darrenRares Buhai darren Data 27 martie 2012 17:45:49
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cmath>
#include <fstream>
#include <algorithm>
#include <deque>

using namespace std;

const int INF = 0x3f3f3f3f;

int N, P[100002];
deque<int> D;
long long result;

inline int done(int x, int y) // x = a, y = b
{
	if (P[x] == P[y]) return INF;
	return (x - 1) + 1LL * P[y] * (x - y) / (P[x] - P[y]) + !(P[y] * (x - y) % (P[x] - P[y]) == 0);
}

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);

	//D.push_back(1);
	for (int i = 1; i <= N; ++i) // de la i incepe clasa I
	{
		while (D.size() >= 2 && done(i, D.back()) <= done(D.back(), D[D.size() - 2]))
			D.pop_back();
		D.push_back(i);
		while (D.size() >= 2 && done(D[1], D[0]) <= i)
		{
			//printf("%d %d YA!\n", D.front(), done(D[1], D[0]));
			D.pop_front();
		}
		result = max(result, 1LL * P[i + 1] * (N - i) + 1LL * P[D.front()] * (i - D.front() + 1));
	}

    fout << result;

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