Pagini recente » Cod sursa (job #430328) | Cod sursa (job #2104576) | Cod sursa (job #2493973) | Cod sursa (job #1586652) | Cod sursa (job #978814)
Cod sursa(job #978814)
#include <iostream>
#include <algorithm>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
#define FILE_IN "ssm.in"
#define FILE_OUT "ssm.out"
void max_subvector_sum(const vector<int> &vec, int &sum, int &start_index, int &end_index)
{
if (vec.empty()) {
sum = 0;
start_index = 0;
end_index = 0;
return;
}
// Kadane
int best_sum = vec[0];
int best_start = 0;
int best_length = 1;
int win_sum = 0;
int win_start = 0;
int win_length = 0;
for (unsigned int i = 0; i < vec.size(); i++) {
win_sum += vec[i];
if (win_sum < 0) {
win_sum = vec[i];
win_start = i;
win_length = 1;
} else {
win_length++;
}
if (win_sum > best_sum) {
best_sum = win_sum;
best_start = win_start;
best_length = win_length;
}
if (win_sum < 0) {
win_sum = 0;
win_start = i + 1;
win_length = 0;
}
}
sum = best_sum;
start_index = best_start + 1;
end_index = best_start + best_length;
}
int main()
{
ifstream fisIn(FILE_IN);
ofstream fisOut(FILE_OUT);
int N;
vector<int> V;
fisIn >> N;
for (int i=0; i<N; i++) {
int temp;
fisIn >> temp;
V.push_back(temp);
}
int sum, start_index, end_index;
max_subvector_sum(V, sum, start_index, end_index);
fisOut << sum << " " << start_index << " " << end_index << endl;
}