Cod sursa(job #3140239)

Utilizator KRISTY06Mateiu Ianis Cristian Vasile KRISTY06 Data 4 iulie 2023 21:14:30
Problema Subsecventa de suma maxima Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.3 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int MAX_LENGTH = 6000000;
const int MAX_VALUE = 2000000000;

int main() {
  /*  int numLen;
    cin >> numLen;
    int num[MAX_LENGTH + 1];
    for (int i = 1; i <= numLen; ++i) {
        cin >> num[i];
    }
    int maxSum = -MAX_VALUE - 1, start = 0, end = 0;
    for (int i = 1; i <= numLen; ++i) {
        int sum = 0;
        for (int j = i; j <= numLen; ++j) {
            sum += num[j];
            if (sum > maxSum) {
                maxSum = sum;
                start = i;
                end = j;
            }
        }
    }
    cout << maxSum << ' ' << start << ' ' << end;*/
    /*int numLen;
    fin >> numLen;
    int sum[MAX_LENGTH + 1] = {0};
    for (int i = 1; i <= numLen; ++i) {
        int number;
        fin >> number;
        sum[i] = sum[i - 1] + number;
    }
    int maxSum = -MAX_VALUE - 1, start = 0, end = 0;
    for (int i = 1; i <= numLen; ++i) {
        for (int j = i; j <= numLen; ++j) {
            if (sum[j] - sum[i - 1] > maxSum) {
                maxSum = sum[j] - sum[i - 1];
                start = i;
                end = j;
            }
        }
    }
    fout << maxSum << ' ' << start << ' ' << end;*/
    int numLen;
    fin >> numLen;
    int num[MAX_LENGTH + 1], sum[MAX_LENGTH + 1] = {0};
    for (int i = 1; i <= numLen; ++i) {
        fin >> num[i];
        sum[i] = num[i] + sum[i - 1];
    }
    int st = 1, end = 1, maxSum = -MAX_VALUE, maxSt = 1, maxEnd = 1;
    for (int i = 1; i <= numLen; ++i) {
        if (num[i] + sum[i - 1] > num[i]) {
            sum[i] = num[i] + sum[i - 1];
            end = i;
            if (num[i] + sum[i - 1] > maxSum) {
                maxSum = num[i] + sum[i - 1];
                maxSt = st;
                maxEnd = end;
            }
        } else {
            sum[i] = num[i];
            st = i;
            end = i;
            if (num[i] > maxSum) {
                maxSum = num[i];
                maxSt = st;
                maxEnd = end;
            }
        }
    }
    fout << maxSum << ' ' << maxSt << ' ' << maxEnd;
    return 0;
}
/*
 7
 5 -6 3 4 -2 3 -3
 =>
 8 3 6
 
 2
 3 1
 =>
 4 1 2
 
 5
 3 1 -3 -1 4
 =>
 4 1 2
 
 1
 3
 =>
 3 1 1
 
 3
 -2 -1 -3
 =>
 -1 2 2
 
 3
 -1 -1 -1
 =>
 -1 1 1
 
 5
 1 -2 3 -4 5
 =>
 5 5 5
 */