Cod sursa(job #2274177)

Utilizator Andrei243Nitu Mandel Andrei Andrei243 Data 1 noiembrie 2018 15:15:18
Problema Subsecventa de suma maxima Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 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)/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;
}