Cod sursa(job #1869681)

Utilizator contnouAndrei Pavel contnou Data 6 februarie 2017 02:45:43
Problema Avioane Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#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;
}