Cod sursa(job #1184920)

Utilizator stanescu.raduRadu Stanescu stanescu.radu Data 14 mai 2014 17:04:56
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream f ("avioane.in");
ofstream g ("avioane.out");

int n;
int v[100005];
long long win[100005], best[100005], sol;

void cautare (int st, int dr)
{
	if (st <= dr)
	{
		long long mij = (st + dr) / 2;
		for (int i = best[st - 1]; i <= min(best[dr + 1], mij); i++)
		{
			if (v[mij] * (n - mij + 1) + v[i] * (mij - i) >= win[mij])
			{
				best[mij] = i;
				win[mij] = v[mij] * (n - mij + 1) + v[i] * (mij - i);
			}
		}
		cautare(st, mij - 1);
		cautare(mij + 1, dr);
	}
}

int main ()
{
	f >> n;
	
	for (int i = 1; i <= n; i++)
		f >> v[i];
	sort (v + 1, v + n + 1);
	
	best[0] = 1;
	best[n + 1] = n;
	cautare(1, n);
	
	sol = 0;
	for (int i = 2; i <= n; i++)
		sol = max(sol, win[i]);
	
	g << sol;
	f.close();
	g.close();
	return 0;
}