#include "kanapka.h" #include "message.h" #include <iostream> typedef long long ll; using namespace std; int main() { int myNodeId = MyNodeId(); int noOfNodes = NumberOfNodes(); ll n = GetN(); ll leftSideMax = 0; ll leftSideSum = 0; ll rightSideMax = 0; ll rightSideSum = 0; ll total = 0; ll bestSum = 0; ll bestMax = 0; ll start = n * myNodeId / noOfNodes; ll end = n * (myNodeId + 1) / noOfNodes; for (ll i = start; i < end; i++) { ll taste = GetTaste(i); leftSideSum += taste; bestSum += taste; total += taste; if (bestSum > 0) { bestSum = 0; } leftSideMax = leftSideMax > leftSideSum ? leftSideSum : leftSideMax; bestMax = bestMax > bestSum ? bestSum : bestMax; } for (ll i = end - 1; i >= start; i--) { ll taste = GetTaste(i); rightSideSum += taste; rightSideMax = rightSideMax > rightSideSum ? rightSideSum : rightSideMax; } if (myNodeId == 0) { ll lefts[101]; ll rights[101]; ll bests[101]; ll totals[101]; lefts[0] = leftSideMax; rights[0] = rightSideMax; bests[0] = bestMax; totals[0] = total; for (int i = 1; i < noOfNodes; i++) { int source = Receive(-1); lefts[source] = GetLL(source); rights[source] = GetLL(source); bests[source] = GetLL(source); totals[source] = GetLL(source); } total = 0; bestSum = 0; bestMax = 0; ll bestTemp = 0; for (int i = 0; i < noOfNodes; i++) { total += totals[i]; bestTemp = bestSum + leftSideMax; bestMax = bestMax > bestTemp ? bestTemp : bestMax; bestMax = bestMax > bests[i] ? bests[i] : bestMax; bestSum = bestSum + totals[i]; if (bestSum > 0) { bestSum = rights[i]; } } cout << total - bestMax << endl; } else { PutLL(0, leftSideMax); PutLL(0, rightSideMax); PutLL(0, bestMax); PutLL(0, total); Send(0); } 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 | #include "kanapka.h" #include "message.h" #include <iostream> typedef long long ll; using namespace std; int main() { int myNodeId = MyNodeId(); int noOfNodes = NumberOfNodes(); ll n = GetN(); ll leftSideMax = 0; ll leftSideSum = 0; ll rightSideMax = 0; ll rightSideSum = 0; ll total = 0; ll bestSum = 0; ll bestMax = 0; ll start = n * myNodeId / noOfNodes; ll end = n * (myNodeId + 1) / noOfNodes; for (ll i = start; i < end; i++) { ll taste = GetTaste(i); leftSideSum += taste; bestSum += taste; total += taste; if (bestSum > 0) { bestSum = 0; } leftSideMax = leftSideMax > leftSideSum ? leftSideSum : leftSideMax; bestMax = bestMax > bestSum ? bestSum : bestMax; } for (ll i = end - 1; i >= start; i--) { ll taste = GetTaste(i); rightSideSum += taste; rightSideMax = rightSideMax > rightSideSum ? rightSideSum : rightSideMax; } if (myNodeId == 0) { ll lefts[101]; ll rights[101]; ll bests[101]; ll totals[101]; lefts[0] = leftSideMax; rights[0] = rightSideMax; bests[0] = bestMax; totals[0] = total; for (int i = 1; i < noOfNodes; i++) { int source = Receive(-1); lefts[source] = GetLL(source); rights[source] = GetLL(source); bests[source] = GetLL(source); totals[source] = GetLL(source); } total = 0; bestSum = 0; bestMax = 0; ll bestTemp = 0; for (int i = 0; i < noOfNodes; i++) { total += totals[i]; bestTemp = bestSum + leftSideMax; bestMax = bestMax > bestTemp ? bestTemp : bestMax; bestMax = bestMax > bests[i] ? bests[i] : bestMax; bestSum = bestSum + totals[i]; if (bestSum > 0) { bestSum = rights[i]; } } cout << total - bestMax << endl; } else { PutLL(0, leftSideMax); PutLL(0, rightSideMax); PutLL(0, bestMax); PutLL(0, total); Send(0); } return 0; } |