Cod sursa(job #2269870)

Utilizator rangrazvanRang Razvan Victor rangrazvan Data 26 octombrie 2018 17:52:43
Problema Subsecventa de suma maxima Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
using namespace std;
int *v;

struct secv{
    int sum, ind1,ind2;
};

secv maxi(secv a, secv b){
    if(a.sum<b.sum) return b;
    if(a.sum>b.sum) return a;
    if(a.ind1<b.ind1) return a;
    if(a.ind1>b.ind1) return b;
    if((a.ind2-a.ind1)>(b.ind2-b.ind1)) return b;
    return a;
}

secv divide(int l,int r){
    int m = (l+r)/2;
    secv r1,r2;
    if(l==r){
        secv x;
        x.sum = v[l];
        x.ind1 = l;
        x.ind2 = r;
        return x;
    }
    r1 = divide(l,m);
    r2 = divide(m+1,r);
    int s=0;
    secv sl,sr;
    sl.sum = 0;
    sl.ind1 = 0;
    sl.ind2 = m;

    sr.sum = 0;
    sr.ind1 = m+1;
    sr.ind2 = 0;
    for(int i = m;i>=l;i--){
        s+=v[i];
        if(s>sl.sum){
            sl.ind1 = i;
            sl.sum = s;
        }
    }
    s = 0;
    for(int i = m+1;i<=r;i++){
        s+=v[i];
        if(s>sr.sum){
            sr.ind2=i;
            sr.sum = s;
        }
    }
    secv r3;
    r3.sum = sl.sum + sr.sum;
    r3.ind1 = sl.ind1;
    r3.ind2 = sr.ind2;
    return maxi(maxi(r1,r2),r3);
}

int main()
{
    ifstream fin("ssm.in");
    ofstream fout("ssm.out");
    int n;
    fin>>n;
    v = new int[n+1];
    for(int i=1;i<=n;i++) fin>>v[i];
    secv rez = divide(1,n);
    if(rez.sum==0 && rez.ind1==0 && rez.ind2==0){
        int maxim = v[1],in=1;
        for(int i=2;i<=n;i++){
            if(v[i]>maxim){
                maxim = v[i];
                in=i;
            }
        }
        fout<<maxim<<" "<<in<<" "<<in;
        return 0;
    }
    fout<<rez.sum<<" "<<rez.ind1<<" "<<rez.ind2;
    return 0;
}