Cod sursa(job #586158)

Utilizator deneoAdrian Craciun deneo Data 30 aprilie 2011 13:54:33
Problema Avioane Scor 40
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 5-9 Marime 0.88 kb
#include<cstdio>
#include<algorithm>
using namespace std;

#define llong long long

int v[100002], pmax[100002], n, k;
llong smax = 0, poz, _max, ptmax; 

int main() {
	int i, j;
	
	freopen("avioane.in", "rt", stdin);
	freopen("avioane.out", "wt", stdout);
	scanf("%d", &n);
	for(i = 1; i <= n; ++i)
		scanf("%d", &v[i]);
	
	sort(v + 1, v + n + 1);
	for(i = n; i > 0; --i)
		if(smax < v[i] * (n - i + 1)) { //poate si = dar nu cred
			smax = v[i] * (n - i + 1);
			pmax[++k] = i;
		}
	smax = 0;
	for(i = 1; i < n; ++i) {
		_max = 0; ptmax = 0;
		for(j = k; j > 0; --j) //sar putea sa trebuiasca sa compar doar ultimele 2 elem
			if(v[i] * (pmax[j] - i) + v[pmax[j]] * (n - pmax[j] + 1) > _max) { //imbunatatiere cu cautare binara
				_max = v[i] * (pmax[j] - i) + v[pmax[j]] * (n - pmax[j] + 1);
				ptmax = j;
			}
		k = ptmax;
		if(_max > smax)
			smax = _max;
	}
	printf("%lld", smax);
	return 0;
}