#include "message.h" #include "kanapka.h" #include <stdio.h> #define MAX(a,b) ((a) > (b) ? a : b) #define MIN(a,b) ((a) < (b) ? a : b) int main() { long long N = GetN(); long long begin = (MyNodeId() * N) / NumberOfNodes(); long long end = ((MyNodeId() + 1) * N) / NumberOfNodes(); //# part1 - solve subproblems long long ix, sum = 0, contMin = 0, prefMin = 0, suffMin; long long prefMax = 0, temp = 0; for (ix = begin; ix < end; ix++) { int t = GetTaste(ix); temp = (temp < 0) ? (temp + t) : t; sum += t; contMin = MIN(contMin, temp); prefMin = MIN(prefMin, sum); prefMax = MAX(prefMax, sum); } suffMin = sum - prefMax; //#part2 - receive the data int i; long long data[128][4]; if (MyNodeId() > 0){ PutLL(0, sum); PutLL(0, contMin); PutLL(0, prefMin); PutLL(0, suffMin); Send(0); } else{ data[0][0] = sum; data[0][1] = contMin; data[0][2] = prefMin; data[0][3] = suffMin; for (i = 1; i < NumberOfNodes(); ++i) { int inst = Receive(-1); data[inst][0] = GetLL(inst); data[inst][1] = GetLL(inst); data[inst][2] = GetLL(inst); data[inst][3] = GetLL(inst); } } //#part3 - calculate the answer long long ans = 0; long long sumAll = 0; if (MyNodeId() == 0){ for (i = 0; i < NumberOfNodes(); ++i) { ans = MIN(ans, data[i][0]); ans = MIN(ans, data[i][1]); ans = MIN(ans, data[i][2]); ans = MIN(ans, data[i][3]); sumAll += data[i][0]; } long long pp = MIN(data[0][0], data[0][3]); for (i = 1; i < NumberOfNodes(); ++i) { ans = MIN(ans, pp + data[i][2]); pp = MIN(pp + data[i][0], data[i][3]); } ans = MIN(ans, sumAll); printf("%lld\n",sumAll - ans); } 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 | #include "message.h" #include "kanapka.h" #include <stdio.h> #define MAX(a,b) ((a) > (b) ? a : b) #define MIN(a,b) ((a) < (b) ? a : b) int main() { long long N = GetN(); long long begin = (MyNodeId() * N) / NumberOfNodes(); long long end = ((MyNodeId() + 1) * N) / NumberOfNodes(); //# part1 - solve subproblems long long ix, sum = 0, contMin = 0, prefMin = 0, suffMin; long long prefMax = 0, temp = 0; for (ix = begin; ix < end; ix++) { int t = GetTaste(ix); temp = (temp < 0) ? (temp + t) : t; sum += t; contMin = MIN(contMin, temp); prefMin = MIN(prefMin, sum); prefMax = MAX(prefMax, sum); } suffMin = sum - prefMax; //#part2 - receive the data int i; long long data[128][4]; if (MyNodeId() > 0){ PutLL(0, sum); PutLL(0, contMin); PutLL(0, prefMin); PutLL(0, suffMin); Send(0); } else{ data[0][0] = sum; data[0][1] = contMin; data[0][2] = prefMin; data[0][3] = suffMin; for (i = 1; i < NumberOfNodes(); ++i) { int inst = Receive(-1); data[inst][0] = GetLL(inst); data[inst][1] = GetLL(inst); data[inst][2] = GetLL(inst); data[inst][3] = GetLL(inst); } } //#part3 - calculate the answer long long ans = 0; long long sumAll = 0; if (MyNodeId() == 0){ for (i = 0; i < NumberOfNodes(); ++i) { ans = MIN(ans, data[i][0]); ans = MIN(ans, data[i][1]); ans = MIN(ans, data[i][2]); ans = MIN(ans, data[i][3]); sumAll += data[i][0]; } long long pp = MIN(data[0][0], data[0][3]); for (i = 1; i < NumberOfNodes(); ++i) { ans = MIN(ans, pp + data[i][2]); pp = MIN(pp + data[i][0], data[i][3]); } ans = MIN(ans, sumAll); printf("%lld\n",sumAll - ans); } return 0; } |