Pagini recente » Cod sursa (job #1897490) | Cod sursa (job #2750625) | Cod sursa (job #3254136) | Cod sursa (job #1812300) | Cod sursa (job #2278710)
#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;
}