Pagini recente » Cod sursa (job #2136214) | Cod sursa (job #353687) | Cod sursa (job #970675) | Cod sursa (job #2511524) | Cod sursa (job #2274177)
#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;
}