Cod sursa(job #788977)

Utilizator damgoodLincan Dan damgood Data 16 septembrie 2012 13:16:01
Problema Subsecventa de suma maxima Scor 85
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <cstdlib>
#include <climits>

#define IN "ssm.in"
#define OUT "ssm.out"

using namespace std;

void read(vector<int> &v)
{
	ifstream in(IN);
	if( false == in.good() )
	{
		cerr << "Can't open input file" << endl;
		exit(1);
	}
	int n;
	in >> n;
	v.reserve(n);
	istream_iterator<int> begin(in);
	istream_iterator<int> end;
	back_insert_iterator< vector<int> > add(v);
	copy(begin, end, add);
}

void print(vector<int> &v)
{
	ofstream out(OUT);
	if( false == out.good() )
	{
		cerr << "Can't open output file" << endl;
		exit(1);
	}
	copy(v.begin(), v.end(), ostream_iterator<int>(out, " "));
	out << endl;
}

struct seq
{
	int sum;
	int start;
	int end;

	seq(int sum, int start, int end) : sum(sum), start(start), end(end) {}
};

ostream& operator<<(ostream &out, const seq &s)
{
	out << s.sum << " " << s.start << " " << s.end;
	return out;
}

seq ssm(vector<int> &v)
{
	int best = INT_MIN;
	int start, end;
	int sum = 0;
	for(size_t i = 0; i < v.size(); ++i)
	{
		if( sum < 0 )
			sum = v[i], start = i;
		else
			sum += v[i];
		if( best < sum )
			best = sum, end = i;
	}

	return seq(best, start + 1, end + 1);
}

int main()
{
	vector<int> v;
	read(v);
	seq best = ssm(v);
	ofstream out(OUT);
	out << best;

	return 0;
}