#include "message.h"
#include <iostream>
#include "maklib.h"
using namespace std;
#define DBG(X)
long long tabSum[200];
long long tabmaxSumFront[200];
long long tabmaxSumEnd[200];
long long tabmaxSumGlobal[200];
int main() {
int n = Size();
if (n < 10000)
{
if (MyNodeId() == 0)
{
long long maxSumEnd = 0;
long long maxSumGlobal = 0;
for (int i = 1; i <= n; i++)
{
int elem = ElementAt(i);
maxSumEnd = max(maxSumEnd + elem, 0LL);
maxSumGlobal = max(maxSumGlobal, maxSumEnd);
}
cout << maxSumGlobal << endl;
}
return 0;
}
int m = (n + NumberOfNodes() - 1) / NumberOfNodes();
long long sum = 0;
long long maxSumFront = 0;
long long maxSumEnd = 0;
long long maxSumGlobal = 0;
for (int i = MyNodeId() * m + 1; i <= min((MyNodeId() + 1) * m, n); i++)
{
int elem = ElementAt(i);
sum += elem;
maxSumEnd = max(maxSumEnd + elem, 0LL);
maxSumGlobal = max(maxSumGlobal, maxSumEnd);
maxSumFront = max(maxSumFront, sum);
}
if (MyNodeId() > 0)
{
PutLL(0, sum);
PutLL(0, maxSumFront);
PutLL(0, maxSumEnd);
PutLL(0, maxSumGlobal);
Send(0);
} else
{
tabSum[0] = sum;
tabmaxSumFront[0] = maxSumFront;
tabmaxSumEnd[0] = maxSumEnd;
tabmaxSumGlobal[0] = maxSumGlobal;
// cout << tabSum[0] << endl;
for (int instancja = 1; instancja < NumberOfNodes(); ++instancja)
{
Receive(instancja);
tabSum[instancja] = GetLL(instancja);
tabmaxSumFront[instancja] = GetLL(instancja);
tabmaxSumEnd[instancja] = GetLL(instancja);
tabmaxSumGlobal[instancja] = GetLL(instancja);
// cout << tabSum[instancja] << endl;
}
//przypadek 1 - global max
long long globRet = 0;
for (int i = 0; i < NumberOfNodes(); i++)
{
globRet = max(globRet, tabmaxSumGlobal[i]);
}
DBG(cout << "1 globRet " << globRet << endl;)
//przypadek 2 - zachodzace front-endy
for (int i = 0; i < NumberOfNodes() - 1; i++)
{
globRet = max(globRet, tabmaxSumEnd[i] + tabmaxSumFront[i + 1]);
}
DBG(cout << "2 globRet " << globRet << endl;)
//przypadek 3 - front - sumy - end
for (int i = 0; i < NumberOfNodes() - 2; i++)
{
long long pref = tabmaxSumEnd[i];
long long s = 0;
for (int j = i + 1; j < NumberOfNodes() - 1; j++)
{
s += tabSum[j];
globRet = max(globRet, pref + s + tabmaxSumFront[j + 1]);
}
}
DBG(cout << "3 globRet " << globRet << endl;)
cout << globRet << endl;
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include "message.h" #include <iostream> #include "maklib.h" using namespace std; #define DBG(X) long long tabSum[200]; long long tabmaxSumFront[200]; long long tabmaxSumEnd[200]; long long tabmaxSumGlobal[200]; int main() { int n = Size(); if (n < 10000) { if (MyNodeId() == 0) { long long maxSumEnd = 0; long long maxSumGlobal = 0; for (int i = 1; i <= n; i++) { int elem = ElementAt(i); maxSumEnd = max(maxSumEnd + elem, 0LL); maxSumGlobal = max(maxSumGlobal, maxSumEnd); } cout << maxSumGlobal << endl; } return 0; } int m = (n + NumberOfNodes() - 1) / NumberOfNodes(); long long sum = 0; long long maxSumFront = 0; long long maxSumEnd = 0; long long maxSumGlobal = 0; for (int i = MyNodeId() * m + 1; i <= min((MyNodeId() + 1) * m, n); i++) { int elem = ElementAt(i); sum += elem; maxSumEnd = max(maxSumEnd + elem, 0LL); maxSumGlobal = max(maxSumGlobal, maxSumEnd); maxSumFront = max(maxSumFront, sum); } if (MyNodeId() > 0) { PutLL(0, sum); PutLL(0, maxSumFront); PutLL(0, maxSumEnd); PutLL(0, maxSumGlobal); Send(0); } else { tabSum[0] = sum; tabmaxSumFront[0] = maxSumFront; tabmaxSumEnd[0] = maxSumEnd; tabmaxSumGlobal[0] = maxSumGlobal; // cout << tabSum[0] << endl; for (int instancja = 1; instancja < NumberOfNodes(); ++instancja) { Receive(instancja); tabSum[instancja] = GetLL(instancja); tabmaxSumFront[instancja] = GetLL(instancja); tabmaxSumEnd[instancja] = GetLL(instancja); tabmaxSumGlobal[instancja] = GetLL(instancja); // cout << tabSum[instancja] << endl; } //przypadek 1 - global max long long globRet = 0; for (int i = 0; i < NumberOfNodes(); i++) { globRet = max(globRet, tabmaxSumGlobal[i]); } DBG(cout << "1 globRet " << globRet << endl;) //przypadek 2 - zachodzace front-endy for (int i = 0; i < NumberOfNodes() - 1; i++) { globRet = max(globRet, tabmaxSumEnd[i] + tabmaxSumFront[i + 1]); } DBG(cout << "2 globRet " << globRet << endl;) //przypadek 3 - front - sumy - end for (int i = 0; i < NumberOfNodes() - 2; i++) { long long pref = tabmaxSumEnd[i]; long long s = 0; for (int j = i + 1; j < NumberOfNodes() - 1; j++) { s += tabSum[j]; globRet = max(globRet, pref + s + tabmaxSumFront[j + 1]); } } DBG(cout << "3 globRet " << globRet << endl;) cout << globRet << endl; } return 0; } |
English