Pagini recente » Cod sursa (job #18413) | Cod sursa (job #128606) | Cod sursa (job #2425904) | Cod sursa (job #341665) | Cod sursa (job #499212)
Cod sursa(job #499212)
#include <stdio.h>
void SMaxON(int v[],int n,int Result[]){
int Suma=v[0];
int SumaMax=v[0];
int PozStart=0;
int PozStartMax=0;
int PozFinalMax=0;
int i;
for (i=1; i<n; i++){
if (Suma<0){
Suma=v[i];
PozStart=i;
}
else
Suma+=v[i];
if (Suma>SumaMax)
{
SumaMax=Suma;
PozStartMax=PozStart;
PozFinalMax=i;
}
}
Result[0]=SumaMax;
Result[1]=PozStartMax;
Result[2]=PozFinalMax;
}
void SMaxONN(int v[],int n,int Result[]){
int Suma,SumaMax,PozStartMax,PozFinalMax,i,j;
SumaMax=v[0];
PozStartMax=0;
PozFinalMax=0;
for (i=0; i<n;i++){
Suma=0;
for (j=i;j<n;j++){
Suma+=v[j];
if (Suma>SumaMax) {
SumaMax=Suma;
PozStartMax=i;
PozFinalMax=j;
}
}
}
Result[0]=SumaMax;
Result[1]=PozStartMax;
Result[2]=PozFinalMax;
}
void SMaxONlgN(int v[],int Left,int Right,int Result[]){
if (Left==Right){
Result[0]=v[Left];
Result[1]=Left;
Result[2]=Right;
return;
}
int MaxLeftSide[3],MaxRightSide[3];
int Middle=(Left+Right)/2;
SMaxONlgN(v,Left,Middle,MaxLeftSide);
SMaxONlgN(v,Middle+1,Right,MaxRightSide);
int Suma=v[Middle];
int Max=v[Middle];
int Start=Middle;
int Final=Middle;
int i;
for (i=Middle-1;i>=Left;i--){
Suma+=v[i];
if (Suma>Max) {
Max=Suma;
Start=i;
}
}
Suma=Max;
for (i=Middle+1;i<=Right;i++){
Suma+=v[i];
if (Suma>Max) {
Max=Suma;
Final=i;
}
}
if (MaxLeftSide[0]>Max){
Max=MaxLeftSide[0];
Start=MaxLeftSide[1];
Final=MaxLeftSide[2];
}
if (MaxRightSide[0]>Max){
Max=MaxRightSide[0];
Start=MaxRightSide[1];
Final=MaxRightSide[2];
}
Result[0]=Max;
Result[1]=Start;
Result[2]=Final;
}
int main(){
int n, v[60000],i,Result[3];
freopen("ssm.in","r",stdin);
freopen("ssm.out","w",stdout);
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",v+i);
SMaxON(v,n,Result);
printf("%d %d %d",Result[0],Result[1]+1,Result[2]+1);
fclose(stdin);
fclose(stdout);
return 0;
}