Pagini recente » Cod sursa (job #2033088) | Cod sursa (job #951533) | Cod sursa (job #936659) | Cod sursa (job #725959) | Cod sursa (job #1334431)
#include <fstream>
#include <vector>
#include <numeric>
using namespace std;
void read(vector<int>& out_data){
ifstream f("ssm.in");
int N, x;
f >> N;
for (int i = 0; i < N; i++){
f >> x;
out_data.push_back(x);
}
f.close();
}
void write(int maxSum, int minIdx, int maxIdx){
ofstream g("ssm.out");
g << maxSum << " " << minIdx << " " << maxIdx << std::endl;
g.close();
}
pair<int, pair<int, int> > findMaxCrossingSequence(const vector<int>& data, int low, int mid, int high){
int left_sum = data[mid];
int max_left = mid;
int sum = 0;
for (int i = mid; i >= low; --i){
sum += data[i];
if (sum > left_sum){
left_sum = sum;
max_left = i;
}
}
int right_sum = data[mid + 1];
int max_right = mid + 1;
sum = 0;
for (int i = mid + 1; i <= high; i++){
sum += data[i];
if (sum > right_sum){
right_sum = sum;
max_right = i;
}
}
return make_pair(left_sum + right_sum, make_pair(max_left, max_right));
}
pair<int, pair<int, int> > findMax(const vector<int>&data, int low, int high){
if (low == high){
return make_pair(data[low], make_pair(low, high));
}
else{
int mid = (low + high) / 2;
pair<int, pair<int, int> > left = findMax(data, low, mid);
pair<int, pair<int, int> > right = findMax(data, mid + 1, high);
pair<int, pair<int, int> > center = findMaxCrossingSequence(data, low, mid, high);
if (left.first > right.first && left.first > center.first){
return left;
}
else if (right.first > left.first && right.first > center.first){
return right;
}
else{
return center;
}
}
}
int main(){
vector<int> data;
read(data);
pair<int, pair<int, int> > result = findMax(data, 0, data.size() - 1);
write(result.first, result.second.first+1, result.second.second+1);
return 0;
}