Pagini recente » Cod sursa (job #143387) | Cod sursa (job #1683887) | Monitorul de evaluare | Cod sursa (job #1230786) | Cod sursa (job #2673844)
#include <bits/stdc++.h>
using namespace std;
void generateIndex(int *a, int n) {
for(int i=0; i<n; i++)
for(int j=i+1; j<n; j++)
cout << i << " " << j << "\n";//faci suma si iese treaba!O(n^2) nu e o solutie prea buna!
}
typedef pair<pair<int, int>, int> pereche;
pereche cautaIntre(int* a, int left, int mij, int right) {
int sumLeft = a[mij];
int indexLeft = mij;
int sum = sumLeft;
for(int i=mij-1; i>=0; i--) {
sum += a[i];
if(sum > sumLeft)
sumLeft = sum, indexLeft = i;
}
int sumRight = a[mij+1];
int indexRight = mij+1;
sum = sumRight;
for(int i=mij+2; i<=right; i++) {
sum += a[i];
if(sum > sumRight)
sumRight = sum, indexRight = i;
}
return {{indexLeft, indexRight}, sumLeft + sumRight};
}
pereche findMaxSubarray(int* a, int left, int right) {
if(left == right)
return {{left, right}, a[left]};
else {
int mij = (left + right) / 2;
pereche p1 = findMaxSubarray(a, left, mij);
pereche p2 = findMaxSubarray(a, mij+1, right);
pereche p3 = cautaIntre(a, left, mij, right);
if(p1.second >= p2.second and p1.second >= p3.second)
return p1;
else if(p3.second >= p1.second and p3.second >= p2.second)
return p3;
else
return p2;
}
}
void solve(int* a, int n) {
int sj = INT_MAX;
int indexJ = -1;
int sum = 0;
for(int i=0; i<=n; i++) {
sum += a[i];
if(sum < sj)
sj = sum, indexJ = i;
}
int si = INT_MIN;
int indexI = -1;
sum = 0;
for(int i = indexJ + 1; i<=n; i++) {
sum += a[i];
if(sum-sj > si)
si = sum, indexI = i;
}
cout << si << " " << indexJ+2 << " " << indexI+1;
}
int main() {
freopen("ssm.in", "r", stdin);
freopen("ssm.out", "w", stdout);
int n;
cin >> n;
int a[n];
for(int i=0; i<n; i++)
cin >> a[i];
//generateIndex(a, n);
// prima varianta, cu divide et impera
// pereche p = findMaxSubarray(a, 0, n-1);
// cout << p.second << " " << p.first.first+1 << " " << p.first.second+1;
// Si = suma de la 0 la i-1, trebuie sa caut deci Max(Si - Sj) sau Si - min(sj) i>j
solve(a, n-1);
return 0;
}