Cod sursa(job #2928363)

Utilizator ulkevinsam kevin ulkevin Data 22 octombrie 2022 20:25:51
Problema Subsecventa de suma maxima Scor 85
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <limits.h>

using namespace std;

#define MAX_N 6000002
//#define MAX_N 62

int input_array[MAX_N] = {0};
int partial_sums[MAX_N] = {0};

int main() {
    int N = 0;

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

    // index from 1!
    cinfile >> N;
    for (int i = 1; i <= N; i++) {
        cinfile >> input_array[i];
    }



    //1. Generate the array of partial sums corresponding to 
    // input_array
    int sum_1_to_j = 0;
    for (int j = 1; j <= N; j++) {
        sum_1_to_j += input_array[j];
        partial_sums[j] = sum_1_to_j;
    }

    //2. For each right-end "j", compute the left-end "i" so that sum(i,j) is maxim.
    //   This sum(i,j) is a candidate solution.
    //   The final solution is the maxim of all the sum(i,j).


    int min_partial_sum = INT_MAX;
    int max_sum = INT_MIN;
    int pos_i = 0;
    int pos_j = 0;

    for (int j = 1; j <= N; j++) {
        if (partial_sums[j] < min_partial_sum) {
            min_partial_sum = partial_sums[j];
            pos_i = j + 1;
        }

        // partial_sums[j] - min_partial_sum is another sum(pos_i, j)
        if (partial_sums[j] - min_partial_sum > max_sum) {
            max_sum = partial_sums[j] - min_partial_sum;
            pos_j = j;
        }
    }

    coutfile << max_sum << " " << pos_i << " " << pos_j << endl;
    

    return 0;
}