Cod sursa(job #530084)

Utilizator feelshiftFeelshift feelshift Data 6 februarie 2011 20:06:57
Problema Subsecventa de suma maxima Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
// http://infoarena.ro/problema/ssm
#include <fstream>
using namespace std;

#define maxLenght 6000001

int lenght,bestSum,leftPosition,rightPosition;
int number[maxLenght],best[maxLenght];

void read();
void getMaxSubsequence();
void findLeftPosition();
void write();

int main() {
	read();
	getMaxSubsequence();
	findLeftPosition();
	write();

	return (0);
}

void read() {
	ifstream in("ssm.in");

	in >> lenght;

	for(int i=1;i<=lenght;i++)
		in >> number[i];

	in.close();
}

void getMaxSubsequence() {
	bestSum = number[1];

	for(int i=1;i<=lenght;++i) {
		// suma este alcatuita dintr-un singur element
		best[i] = number[i];

		// daca suma poate fi marita (legata de suma precedenta)
		if(best[i] < best[i-1] + number[i])
			best[i] = best[i-1] + number[i];

		// daca s-a gasit un nou maxim
		if(bestSum < best[i]) {
			bestSum = best[i];	// se retine suma maxima
			rightPosition = i;	// se retine capatul din "dreapta"
		}
	}
}

void findLeftPosition() {
	int tmp = 0;

	for(int i=rightPosition;i>=1;i--) {
		tmp = tmp + number[i];

		// daca s-a gasit capatul din "stanga" al subsecventei
		if(tmp == bestSum) {
			leftPosition = i;	// se retine pozitia

			/* daca este zero, subsecventa poate incepe mai de la "stanga",
			** fiind necesara continuarea parcurgerii vectorului */
			if(!number[i-1])
				continue;
			else
				break;
		}
	}
}

void write() {
	ofstream out("ssm.out");

	out << bestSum << " " << leftPosition << " " << rightPosition << "\n";

	out.close();
}