Pagini recente » Cod sursa (job #2385541) | Cod sursa (job #2680356) | Cod sursa (job #2891102) | Cod sursa (job #1432629) | Cod sursa (job #1869691)
#include <fstream>
#include <algorithm>
#define MAXN 100005
using namespace std;
ifstream f("avioane.in");
ofstream g("avioane.out");
struct queueItem {
int value;
int position;
int leadPrevisionedPos;
queueItem() {
value = 0;
position = 0;
leadPrevisionedPos = 0;
}
queueItem(int gValue, int gPosition, int gLeadProvisionedPos) {
value = gValue;
position = gPosition;
leadPrevisionedPos = gLeadProvisionedPos;
}
};
void readData(int *sums, int &sumsLength) {
//
f >> sumsLength;
for (int i = 0; i < sumsLength; i++) {
f >> sums[i];
}
}
long long getMax(long long m1, long long m2) {
//
return m1 > m2 ? m1 : m2;
}
void getMaximumProfit(int *sums, int sumsLength, long long &maximumProfit) {
//
queueItem q[MAXN];
int qStart = 0, qEnd = 0;
maximumProfit = 0;
q[qStart] = queueItem(sums[0], 0, 0);
sort(sums, sums + sumsLength);
for (int 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() {
//
int sums[MAXN], sumsLength;
long long maximumProfit;
readData(sums, sumsLength);
getMaximumProfit(sums, sumsLength, maximumProfit);
g << maximumProfit;
return 0;
}