Cod sursa(job #1895544)

Utilizator icansmileSmileSmile icansmile Data 28 februarie 2017 00:26:57
Problema Subsecventa de suma maxima Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

struct meeting_point{
    int starting;
    int ending;
};

meeting_point meet;
vector<int> initial_vector;
int number_of_elements;
int bestSum = INT32_MIN;

void solve_base_case(int high) {
    if (bestSum < initial_vector[high])
    {
        bestSum = initial_vector[high];
        meet.starting = meet.ending;
        meet.ending = high;
    }
}

void find_sum(int low, int high, int mid) {
    int suf = 0;
    int pre = 0;
    int left;
    int right;
    int i;
    int j;
    int maximumSuffix = INT32_MIN;
    int maximumPrefix = INT32_MIN;

    for (i = mid; i >= low; i--) {
        suf += initial_vector[i];
        if (suf >= maximumSuffix)  {
            maximumSuffix = suf;
            left = i;
        }
    }
    for (j = mid + 1; j <= high; j++) {
        pre += initial_vector[j];
        if (pre > maximumPrefix)  {
            maximumPrefix = pre;
            right = j;
        }
    }

    if (maximumPrefix + maximumSuffix > bestSum)
    {
        bestSum = maximumPrefix + maximumSuffix;
        meet.starting = left;
        meet.ending = right;
    }
}

void solve(int low, int high) {
    if (high == low) {
        solve_base_case(high);
        return ;
    }
    int mid = low + (high - low)/2;

    solve(low, mid);
    solve(mid + 1, high);

    find_sum(low, high, mid);
}

int main(void) {
    int element;

    ifstream in("ssm.in");
    ofstream out("ssm.out");

    in >> number_of_elements;

    for(int i = 1; i <=number_of_elements; i++)
    {
        in >> element;
        initial_vector.push_back(element);
    }

    solve(0, number_of_elements);

    out << bestSum << " " << (meet.starting + 1) << " " << (meet.ending + 1);

    in.close();
    out.close();
    return 0;
}