Cod sursa(job #2675778)

Utilizator MindralexMindrila Alex Mindralex Data 22 noiembrie 2020 15:39:07
Problema Subsecventa de suma maxima Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.06 kb
#include <iostream>
#include <fstream>
#include <climits>

using namespace std;

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

const int valMax = 6e6;

struct in
{
    int s, d;
};

int v[valMax+1], s[valMax+1], stm, drm, sm = 0, n;

void div (int st, int dr, int &rst, int &rdr)
{
    if (st == dr)//daca am ajuns la un singur element
    {
        rst = st;
        rdr = dr;
        //se returneaza pozitia elementului
    }
    else
    {
        int mij = (st+dr)/2; //se calculeaza mijlocul

        in ain;
        div (st, mij , ain.s, ain.d);
        int a = s[ain.d] - s[ain.s - 1]; //declar si calculez coordonatele din stanga + suma

        in bin;
        div (mij+1, dr, bin.s, bin.d);
        int b = s[bin.d] - s[bin.s - 1]; //declar si calculez coordonatele din dreapta + suma

        int i;
        int sumst = 0;
        int maxsumst = INT_MIN;
        int maxindst = 0;
        for (i = mij; i >= 1; i--)
        {
            sumst += v[i];
            if (sumst >= maxsumst)
            {
                maxsumst = sumst;
                maxindst = i;
            }
        } //am calculat coordonatele din stanga + sumamax din stanga

        int sumdr = 0;
        int maxsumdr = INT_MIN;
        int maxinddr = 0;
        for (i = mij + 1; i <= n; i++)
        {
            sumdr =+ v[i];
            if (sumdr >= maxsumdr)
            {
                maxsumdr = sumdr;
                maxinddr = i;
            }
        } // am calculat coordonatele din dreapta + summax din dreapta

        //cout << " ain.s=" << ain.s << " ain.d=" << ain.d << " a=" << a << '\n';
        //cout << " bin.s=" << bin.s << " bin.d=" << bin.d << " b=" << b << '\n';
        //cout << " maxindst=" << maxindst << " maxinddr=" << maxinddr << " maxsumst+maxsumdr=" << maxsumst+maxsumdr << '\n';
        int m = max(a, b);
        m = max (m, maxsumst+maxsumdr); //calculez suma maxima
        //cout << "m=" << m << '\n';
        if (m == a) //daca suma maxima ii subsecventa din stanga
        {
            rst = ain.s;
            rdr = ain.d;
            if (s[rdr] - s[rst - 1] > s[drm] - s[stm-1])
            {
                drm = rdr;
                stm = rst;
            }
        }
        else if (m == b) //daca suma maxima ii subsecventa din dreapta
        {
            rst = bin.s;
            rdr = bin.d;
            if (s[rdr] - s[rst - 1] > s[drm] - s[stm-1])
            {
                drm = rdr;
                stm = rst;
            }
        }
        else
        { //daca suma maxima ii subsecventa din mijloc
            rst = maxindst;
            rdr = maxinddr;
            if (s[rdr] - s[rst - 1] > s[drm] - s[stm-1])
            {
                drm = rdr;
                stm = rst;
            }
        }
    }


}

int main()
{
    fin >> n;
    for (int i = 1; i <= n ; i++)
    {
        fin >> v[i];
        s[i] = s[i-1] + v[i];
    }
    int o,p;
    div (1, n, o, p);
    fout << s[drm] - s[stm-1] << ' ' << stm << ' ' << drm;
    return 0;
}