Cod sursa(job #2322962)

Utilizator MrRobotMrRobot MrRobot Data 18 ianuarie 2019 17:16:03
Problema Subsecventa de suma maxima Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <limits.h>
using namespace std;

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

vector <int> v;

int secvStart, secvStop;

struct secv {
    int suma;
    int s, f;
};

secv maxim( secv a, secv b) {
    if(a.suma > b.suma)
        return a;
    else {
         if(a.suma == b.suma) {
            if( a.s < b.s )
                return a;
            else if(a.s == b.s) {
                if( (a.f - a.s) < (b.f - b.s) )
                    return a;
                else
                    return b;
                }
                else
                    return b;
        }
        else
            return b;
    }
}


secv subsMax( int st, int dr ){
    if(st == dr) {
        secv s;
        s.suma = v[st];
        s.s = s.f = st;
        return s;
    }
    int m = (st+dr) / 2;
    secv maxSt = subsMax(st, m);
    secv maxDr = subsMax(m+1, dr);
    int maxStM=INT_MIN, maxDrM = INT_MIN;
    int i, s1=0, s2=0;
    int start=m, stop=m;
    for(i=m; i>=st; i--) {
        s1 += v[i];
        if(s1 >= maxStM) {
            maxStM = s1;
            start = i;
        }
    }
    for(i=m+1; i<=dr; i++) {
        s2 += v[i];
        if(s2 > maxDrM) {
            maxDrM = s2;
            stop = i;
        }
    }
    secv s;
    s.suma = maxStM+maxDrM;
    s.s = start;
    s.f = stop;
    return maxim( maxim(maxSt, maxDr), s);

}


int main()
{
    int n;
    fin>>n;
    int i;
    v.push_back(INT_MIN);
    for(i=1; i<=n; i++)
    {
        int x;
        fin>>x;
        v.push_back(x);
    }
    secv sol = subsMax(1, n);
    fout<<sol.suma<<" "<<sol.s<<" "<<sol.f;
}