Pagini recente » Metoda Greedy si problema fractionara a rucsacului | infoarena - comunitate informatica, concursuri de programare | Monitorul de evaluare | Cod sursa (job #137788) | Cod sursa (job #1713979)
#include<fstream>
#define MAXN 6000005
using namespace std;
int A[MAXN];
int n;
struct subseq {
int left, right, sum;
};
subseq best(subseq a, subseq b) {
//
if (a.sum > b.sum) {
return a;
} else if (a.sum < b.sum) {
return b;
} else if (a.left < b.left || (a.left == b.left && a.right < b.right)) {
return a;
} else {
return b;
}
}
subseq ssm(int* A, int left, int right) {
//
if (left == right) {
subseq s = { left, right, A[left] };
return s;
}
int mid = (left + right) / 2;
subseq s1 = ssm(A, left, mid);
subseq s2 = ssm(A, mid + 1, right);
int leftsum = 0, leftstart = mid;
int rightsum = 0, rightend = mid;
for (int sum = 0, i = mid - 1; i >= left; i--) {
sum += A[i];
if (sum >= leftsum) {
leftstart = i;
leftsum = sum;
}
}
for (int sum = 0, i = mid + 1; i <= right; i++) {
sum += A[i];
if (sum >= rightsum) {
rightend = i;
rightsum = sum;
}
}
subseq combine = { leftstart, rightend, leftsum + rightsum + A[mid] };
return best(best(s1, s2), combine);
}
int main() {
ifstream f("ssm.in");
ofstream g("ssm.out");
f >> n;
for(int i = 1; i <= n; i++) {
f >> A[i];
}
subseq s = ssm(A, 1, n);
g << s.sum << " " << s.left << " " << s.right;
return 0;
}