Cod sursa(job #2274909)

Utilizator CristianaMelinceanuMelinceanu Cristiana CristianaMelinceanu Data 2 noiembrie 2018 17:29:13
Problema Subsecventa de suma maxima Scor 15
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>

using namespace std;

int v[100];
struct secventa
{
    int l=0;
    int r=0;
    int sum=0;
};

secventa divide(int left,int right)
{

    int m=(left+right)/2;

    if(left==right)
    {
        secventa a;
        a.sum=v[left];
        a.l=left;
        a.r=right;
        return a;
    }
    secventa r1,r2;
    r1=divide(left,m);
    r2=divide(m+1,right);
    secventa sleft,sright;
    sleft.sum=0;
    sleft.l=0;
    sleft.r=m;
    sright.l=m+1;
    sright.r=0;
    sright.sum=0;
    int s=0;
     secventa r3;
    r3.sum=0;
    r3.l=0;
    r3.r=0;
    for(int i=m;i>=left;i--)
    {
        s=s+v[i];
        if(sleft.sum<s)
        {
            sleft.sum=s;
            sleft.l=i;
        }
    }
    s=0;
    for(int i=m+1;i<=right;i++)
    {
        s+=v[i];
        if(sright.sum<s)
           {
               sright.sum=s;
               sright.r=i;
           }
    }

    r3.sum=sleft.sum + sright.sum;
    r3.l = sleft.l;
    r3.r = sright.r;
    if(r1.sum >r2.sum)
    {
        if(r1.sum > r3.sum)
            return r1;
        else return r3;
    }
    else
    {
        if(r2.sum<r3.sum)
            return r3;
        else return r2;
    }

}

int main()
{
    int n;
    ifstream f("ssm.in");
    ofstream g("ssm.out");
    f>>n;
    for(int i=1;i<=n;i++)
        f>>v[i];
    secventa suma=divide(1,n);
    int poz;
    if(suma.sum==0 && suma.l==0 && suma.r==0)
    {
        int maxi=v[1];
        poz=1;
        for(int i=1;i<=n;i++)
            if(v[i]>maxi)
            {
                maxi=v[i];
                poz=i;
            }
        g<<maxi<<" "<<poz<<" "<<poz;
    }
    else{
    g<<suma.sum<<" "<<suma.l<<" "<<suma.r;}
    f.close();
    g.close();


    return 0;
}