Cod sursa(job #3239101)

Utilizator filipinezulBrain Crash filipinezul Data 2 august 2024 13:51:31
Problema Subsecventa de suma maxima Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
using namespace std;

/**
 * @brief substring inseamna elem consecutive
 * 12345 --> exemple 123, 345
 * 
 * dp[i] = suma substringului de sumă maximă (suma SSM) folosind doar
 * primele i elemente din vectorul v și care se termină pe poziția i
 */
class Task { // T = O(n), S = O(1)
 public:
    void solve() {
        read_input();
        get_result();
        print_output();
    }

 private:
    int32_t n;
    int32_t dp;

    int32_t start;
    int32_t end;

    int32_t sol;
    vector<int32_t> v;

    void read_input() {
        ifstream fin("ssm.in");
        fin >> n;
        
        v.resize(n + 1);

        for (int i = 1; i <= n; i++) {
            fin >> v[i];
        }

        fin.close();
    }

    void get_result() {
        // caz de baza: un singur element
        start = 1;
        end = 1;
        
        dp = v[1];
        sol = v[1];

        int idx;
        // caz general
        for (int i = 2; i <= n; ++i) {
		    if (dp >= 0) {
			    dp += v[i];

		    } else {
                dp = v[i];
                idx = i;
            }

            if (sol < dp) {
                sol = dp;
                start = idx;
                end = i;
            }
	    }
    }

    void print_output() {
        ofstream fout("ssm.out");
        fout << sol << " " << start << " " << end << "\n";
        fout.close();
    }
};

int main() {
    auto* task = new (nothrow) Task();

    if (!task) {
        std::cerr << "new failed\n";
        return -1;
    }

    task->solve();
    delete task;

    return 0;
}