Cod sursa(job #587534)

Utilizator freak93Adrian Budau freak93 Data 5 mai 2011 01:22:17
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const char iname[] = "avioane.in";
const char oname[] = "avioane.out";

ifstream f(iname);
ofstream g(oname);

long double	time_swap(const pair<int, int> &a, const pair<int, int> &b) {
		long double frac = static_cast<long long>(b.first) * b.second - static_cast<long long>(a.first) * a.second;
		frac /= b.first - a.first;
		return frac;
}

int main() {
	size_t N; f >> N;

	vector<int> values(N);
    for (size_t i = 0; i < N; ++i)
		f >> values[i];

	sort(values.begin(), values.end());

	vector< pair<int, int> > stack(N, pair<int, int>(0, 0));
	size_t start = 0, finish = 0;

	long long answer = static_cast<long long>(values[0]) * static_cast<long long>(N);
	for (size_t i = 0; i < N; ++i) {

		while (start + 1 < finish && time_swap(stack[start], stack[start + 1]) < i + 1)
			++start;

		if (i == 0 || values[i] != values[i - 1]) {
			while (start + 1 < finish && time_swap(stack[finish - 1], make_pair(values[i], i)) < time_swap(stack[finish - 2],  stack[finish - 1]))
				finish--;

			stack[finish++] = make_pair(values[i], i);
		}

        if (i != N - 1)
			answer = max(answer, static_cast<long long>(stack[start].first) * (i + 1 - stack[start].second) + static_cast<long long>(N - i - 1) * values[i + 1]);
		else
			answer = max(answer, static_cast<long long>(stack[start].first) * (i + 1 - stack[start].second));

		//fprintf(stderr, "%lld\n", answer);
	}

	g << answer << "\n";
}