Pagini recente » Cod sursa (job #2040665) | Statistici bieltz vlad (VladBtz) | Cod sursa (job #1660876) | Cod sursa (job #826740) | Cod sursa (job #530084)
Cod sursa(job #530084)
// 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();
}