Pagini recente » Monitorul de evaluare | Cod sursa (job #3344048)
// SPDX-License-Identifier: BSD-3-Clause
#include <fstream> // ifstream, ofstream
#include <iostream> // cin, cout, cerr
#include <memory> // unique_ptr pentru Task
#include <vector> // vector
using namespace std;
class Task {
public:
void solve() {
read_input();
write_output(get_result());
}
private:
int n;
vector<int> v;
int start_pos, end_pos;
void read_input() {
ifstream fin("ssm.in");
// citeste datele
fin >> n;
v.resize(n); // redimensioneaza v sa aiba n elememnte
for (int i = 0; i < n; ++i) {
fin >> v[i];
}
fin.close();
}
int get_result() {
vector<int> dp(n); // vector cu n elemente
vector<int> start(n);
// caz de baza
dp[0] = v[0];
start[0] = 0;
// caz general
for (int i = 1; i < n; ++i) {
if (dp[i - 1] >= 0) {
// extinde la dreapta cu v[i]
dp[i] = dp[i - 1] + v[i];
start[i] = start[i - 1];
} else {
// incep o noua secventa
dp[i] = v[i];
start[i] = i;
}
}
// solutia e maximul din vectorul dp
int sol = dp[0], pos = 0;
for (int i = 1; i < n; ++i) {
if (dp[i] > sol) {
sol = dp[i];
pos = i;
}
}
start_pos = start[pos];
end_pos = pos;
return sol;
}
void write_output(int result) {
ofstream fout("ssm.out");
fout << result << " " << start_pos + 1 << " " << end_pos + 1 << "\n";
fout.close();
}
};
// [ATENTIE] NU modifica functia main!
int main() {
std::unique_ptr<Task> task {new (nothrow) Task()};
if (!task) {
std::cerr << "new failed: WTF are you doing? Throw your PC!\n";
return -1;
}
task->solve();
return 0;
}