Cod sursa(job #591956)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 26 mai 2011 05:57:52
Problema Avioane Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.78 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int nmax = 100010;
long long A[nmax], Poz[nmax];
long long Sol[nmax], val, S, N;

void calc(int st, int dr)
{
	long long m = (st + dr) >> 1, i;

	for( i = Poz[st - 1]; i <= Poz[dr + 1]; i++)
	{
		val = 1LL * (m - i + 1) * A[i];

		if(val > Sol[m])
			Sol[m] = val, Poz[m] = i;
	}

	if(m < dr) calc(m + 1, dr);
	if(st > m) calc(st, m - 1);
}

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

	in >> N;

	long long i;
	for(i = 1; i <= N; i++)
		in >> A[i];

	sort(A + 1, A + 1 + N);

	Poz[N + 1] = N;
	calc(1, N);

	for(i = 2; i <= N; i++)
	{
		val = Sol[i - 1] + 1LL * A[i] * (N - i + 1);
		if( val > S )
			S = val;
	}

	out << S << "\n";

	return 0;
}