Cod sursa(job #2771808)

Utilizator AsandeiStefanAsandei Stefan-Alexandru AsandeiStefan Data 29 august 2021 12:39:14
Problema Subsecventa de suma maxima Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
/* VARIANTA RECURSIVA 60p
#include <fstream>
#include <cstdlib>

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

struct element {
	int value;
	int start_pos;
	int end_pos;

	element& operator= (const element& other) {
		this->value = other.value;
		this->start_pos = other.start_pos;
		this->end_pos = other.end_pos;
		return *this;
	}
};

int n;
int v[6000010];
element dp[6000010];

element solve(int n) {
	if(n == 0) {
		dp[0].value = v[0];
		dp[0].start_pos = 0;
		dp[0].end_pos = 0;
 		return dp[0];
	}

	dp[n - 1] = solve(n - 1);

	if (dp[n - 1].value + v[n] > v[n]) {
		dp[n].value = dp[n - 1].value + v[n];
		dp[n].end_pos = dp[n-1].end_pos+1;
		dp[n].start_pos = dp[n - 1].start_pos;
		return dp[n];
	}
	else {
		dp[n].value = v[n];
		dp[n].start_pos = n;
		dp[n].end_pos = n;
		return dp[n];
	}
}


int main() {
	fin >> n;

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

	solve(n);

	element m = { INT32_MIN, 0, 0 };
	for (int i = 0; i < n; i++) {
		if (m.value < dp[i].value) {
			m = dp[i];
		}
	}

	fout << m.value << ' ' << m.start_pos+1 << ' ' << m.end_pos+1 << '\n';

	return 0;
}*/ 

#include <fstream>
#include <cstdlib>

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

int n, a, s, inceput, sfarsit, max_s = INT32_MIN, max_inceput, max_sfarsit;

int main() {
	fin >> n;

	for (int i = 1; i <= n; i++) {
		fin >> a;
		if (s + a > a) {
			s += a;
			sfarsit++;
		} else {
			inceput = i;
			sfarsit = i;
			s = a;
		}
		if(s > max_s) {
			max_s = s;
			max_inceput = inceput;
			max_sfarsit = sfarsit;
		}
	}

	fout << max_s << ' ' << max_inceput << ' ' << max_sfarsit << '\n';

	return 0;
}