Pagini recente » Borderou de evaluare (job #2932000) | Cod sursa (job #587534)
Cod sursa(job #587534)
#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";
}