Cod sursa(job #634220)

Utilizator ContraPunctContrapunct ContraPunct Data 15 noiembrie 2011 21:02:34
Problema Subsecventa de suma maxima Scor 85
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<fstream>
const int Nmax = 6000000;
using namespace std;

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

int indice_inceput,indice_sfarsit;
int x[Nmax],suma;
int lungime;
int n;

void Sol()
{
	int i;
	fin>>n;
	indice_inceput = indice_sfarsit = 1;
	fin>>x[1];
	suma = x[1];
	
	int suma_partiala = x[1];
	int ind_inceput = 1;

	for( i=2;i<=n;++i)
	{

		/*Dacă există mai mult subsecvenţe candidate la soluţie, atunci se va tipări cea cu
		indicele de început cel mai mic, iar în caz de egalitate cea mai scurtă.*/


		fin>>x[i];
		if( suma_partiala +x[i] >= x[i] && x[i] >0 )
		{
			suma_partiala = suma_partiala + x[i];
		}
		else
		if( suma_partiala +x[i] >= x[i] && x[i] < 0 )
		{
			if(suma_partiala > suma)
			{
				indice_inceput = ind_inceput;
				indice_sfarsit = i-1;
				suma = suma_partiala;
			}	
			suma_partiala = suma_partiala + x[i];
		}
		else
		if( suma_partiala +x[i] >= x[i] && x[i] == 0 )
		{
			if(suma_partiala > suma)
			{
				indice_inceput = ind_inceput;
				indice_sfarsit = i-1;
				suma = suma_partiala;
			}	
		}
		else
		{
			if(suma_partiala > suma)
			{
				indice_inceput = ind_inceput;
				indice_sfarsit = i-1;
				suma = suma_partiala;
			}	
			ind_inceput = i;
			suma_partiala = x[i];
		}
	}
	if(suma_partiala > suma)
	{
		indice_inceput = ind_inceput;
		indice_sfarsit = i-1;
		suma = suma_partiala;
	}	

	fout<<suma<<" "<<indice_inceput<<" "<<indice_sfarsit<<"\n";
}

int main()
{
	Sol();
	fout.close();
	fin.close();
	return 0;
}