Nu aveti permisiuni pentru a descarca fisierul grader_test46.ok
Cod sursa(job #974531)
Utilizator | Data | 17 iulie 2013 14:29:35 | |
---|---|---|---|
Problema | Subsecventa de suma maxima | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.46 kb |
/*
Subsecventa de suma maxima
Se dă un şir S[] = (s1, s2, .., sN) de lungime N. O subsecvenţă a şirului este de forma: (si, si+1, ..., sj) cu 1 ≤ i ≤ j ≤ N, iar suma subsecvenţei este si + si+1 + ... + sj.
Cerinţă
Se cere să se determine subsecvenţa de sumă maximă.
Date de intrare
Fişierul de intrare ssm.in conţine pe prima linie un număr natural N, reprezentând lungimea şirului. Următoarea linie conţine N numere întregi separate printr-un spaţiu, reprezentând în ordine elementele şirului.
Date de ieşire
În fişierul de ieşire ssm.out se vor tipări trei numere în această ordine: suma subsecvenţei de sumă maximă, indicele de început şi indicele de sfârşit.
*/
#include <iostream>
using namespace std;
const int LMAX = 7000005;
int n,arr[LMAX], start, finish;
int MaxSum(int arr[], int n, int &start, int &finish)
{
int sum=0;
int maxSum=INT_MIN;
int local_start=1;
finish=-1;
for (int i=1; i<=n; i++)
{
sum+=arr[i];
if (sum <0)
{
sum=0;
local_start=i+1;
}
if (sum > maxSum)
{
maxSum=sum;
start=local_start;
finish=i;
}
}
if (finish != -1 )
return maxSum;
return -1;
}
int main(int argc, _TCHAR* argv[])
{
freopen("ssm.in","r",stdin);
freopen("ssm.out","w",stdout);
cin>>n;
for(int i=1; i<=n; i++)
cin>>arr[i];
cout<<MaxSum(arr,n,start,finish)<<" ";
cout<<start<<" "<<finish;
return 0;
}