Pagini recente » Cod sursa (job #3003989) | Cod sursa (job #846463) | Cod sursa (job #1325965) | Cod sursa (job #3001858) | Cod sursa (job #1869681)
#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];
}
}
int getMax(int m1, int m2) {
//
return m1 > m2 ? m1 : m2;
}
void getMaximumProfit(int *sums, int sumsLength, int &maximumProfit) {
//
queueItem q[MAXN];
int qStart = 0, qEnd = 0;
maximumProfit = 0;
q[qStart] = queueItem(sums[0], 0, 1);
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++;
int sumRight = sums[i] * (sumsLength - i);
int 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, maximumProfit;
readData(sums, sumsLength);
getMaximumProfit(sums, sumsLength, maximumProfit);
g << maximumProfit;
return 0;
}