Pagini recente » Cod sursa (job #2263996) | Cod sursa (job #2164497) | Cod sursa (job #3201827) | Cod sursa (job #2766705) | Cod sursa (job #1869690)
#include <fstream>
#include <algorithm>
#define MAXN 100005
using namespace std;
ifstream f("avioane.in");
ofstream g("avioane.out");
struct queueItem {
long long value;
long long position;
long long leadPrevisionedPos;
queueItem() {
value = 0;
position = 0;
leadPrevisionedPos = 0;
}
queueItem(long long gValue, long long gPosition, long long gLeadProvisionedPos) {
value = gValue;
position = gPosition;
leadPrevisionedPos = gLeadProvisionedPos;
}
};
void readData(long long *sums, long long &sumsLength) {
//
f >> sumsLength;
for (long long i = 0; i < sumsLength; i++) {
f >> sums[i];
}
}
long long getMax(long long m1, long long m2) {
//
return m1 > m2 ? m1 : m2;
}
void getMaximumProfit(long long *sums, long long sumsLength, long long &maximumProfit) {
//
queueItem q[MAXN];
long long qStart = 0, qEnd = 0;
maximumProfit = 0;
q[qStart] = queueItem(sums[0], 0, 0);
sort(sums, sums + sumsLength);
for (long long i = 1; i < sumsLength; i++) {
//
if (sums[i] - q[qEnd].value == 0) continue;
if (qStart < qEnd && q[qStart + 1].leadPrevisionedPos <= i - 1) qStart++;
long long sumRight = sums[i] * (sumsLength - i);
long long sumLeft = (i - q[qStart].position) * q[qStart].value;
maximumProfit = getMax(maximumProfit, sumLeft + sumRight);
while (qEnd >= qStart && (q[qEnd].leadPrevisionedPos >= i + ((q[qEnd].value * (i - q[qEnd].position)) / (sums[i] - q[qEnd].value)))) {
qEnd--;
}
q[qEnd + 1] = queueItem(sums[i], i, i + ((q[qEnd].value * (i - q[qEnd].position)) / (sums[i] - q[qEnd].value)));
qEnd++;
}
return;
}
int main() {
//
long long sums[MAXN], sumsLength;
long long maximumProfit;
readData(sums, sumsLength);
getMaximumProfit(sums, sumsLength, maximumProfit);
g << maximumProfit;
return 0;
}