Cod sursa(job #2278710)

Utilizator Andrei243Nitu Mandel Andrei Andrei243 Data 8 noiembrie 2018 14:50:45
Problema Subsecventa de suma maxima Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <iostream>
#include <fstream>
#include <vector>


using namespace std;

struct el_max
{
    int valoare,indice_left,indice_right;
    el_max(int _val,int _left, int _right):valoare(_val),indice_left(_left),indice_right(_right) {};

};


el_max ret_max(el_max el1,el_max el2)
{
    if(el1.valoare>el2.valoare)
        return el1;
    else if(el2.valoare>el1.valoare)
        return el2;
    else
    {
        if(el1.indice_left<el2.indice_left)
            return el1;
        else if(el2.indice_left<el1.indice_left)
            return el2;

        else
        {
            if((el1.indice_right-el1.indice_left)<(el2.indice_right-el2.indice_left))
                return el1;
            else
                return el2;

        }



    }

}

el_max maxim_interval(vector<int> &elemente,int left,int right)
{
    if(left==right)
        return el_max( elemente[left],left,right);

    int medie=left+(right-left)/2;

    el_max aux1=maxim_interval(elemente,left,medie);
    el_max aux2=maxim_interval(elemente,medie+1,right);
    int sum=elemente[medie];
    el_max maxim_s(elemente[medie],medie,medie);
    for(int i=medie-1; i>=left; i--)
    {
        sum+=elemente[i];
        if(sum>=maxim_s.valoare)
        {
            maxim_s.valoare=sum;
            maxim_s.indice_left=i;
        }
    }
    sum=elemente[medie];
    el_max maxim_d(elemente[medie],medie,medie);
    for(int i=medie+1; i<=right; i++)
    {
        sum+=elemente[i];
        if(sum>maxim_d.valoare)
        {
            maxim_d.valoare=sum;
            maxim_d.indice_right=i;
        }

    }
    el_max maxim(maxim_s.valoare+maxim_d.valoare-elemente[medie],maxim_s.indice_left,maxim_d.indice_right);

    return ret_max(aux1,ret_max(aux2,maxim));

}




int main()
{
    ifstream in("ssm.in");
    ofstream out("ssm.out");

    int nr_elemente;
    in>>nr_elemente;

    vector<int> numere;

    for(int i=0; i<nr_elemente; i++)
    {
        int aux;
        in>>aux;
        numere.push_back(aux);
    }



    el_max aux=maxim_interval(numere,0,numere.size()-1);

    out<<aux.valoare<<" "<<aux.indice_left+1<<" "<<aux.indice_right+1;

    in.close();
    out.close();
    return 0;
}