#include "maklib.h"
#include "message.h"
#include <algorithm>
#include <iostream>
using namespace std;
int main() {
int n = Size();
const int N = NumberOfNodes();
const int ID = MyNodeId();
int len = (n + N - 1) / N;
int beg = min(ID * len, n);
int end = min((ID + 1) * len, n);
if (beg == end) {
PutChar(0, 'f');
// cerr << ID << ": " << "fail" << endl;
} else {
PutChar(0, 'w');
int sum = 0;
int bestEnd = 0;
int bestStart = 0;
for (int i = beg; i < end; ++i) {
int e = ElementAt(i+1);
sum += e;
bestEnd = max(bestEnd, sum);
bestStart = min(bestStart, sum);
}
bestStart = sum - bestStart;
int bestMid = sum;
PutInt(0, bestStart);
PutInt(0, bestMid);
PutInt(0, bestEnd);
// cerr << ID << ": " << "win: " << bestStart << ", " << bestMid << ", " << bestEnd << endl;
}
Send(0);
if (ID == 0) {
int bestStart[N];
int bestMid[N];
int bestEnd[N];
int liveNodes = N;
for (int i = 0; i < N; ++i) {
Receive(i);
if ('w' == GetChar(i)) {
bestStart[i] = GetInt(i);
bestMid[i] = GetInt(i);
bestEnd[i] = GetInt(i);
} else {
liveNodes = i;
break;
}
}
int best = 0;
int current = 0;
for (int i = 0; i < liveNodes; ++i) {
best = max(best, current + bestEnd[i]);
current = max(current + bestMid[i], bestStart[i]);
}
best = max(best, current);
cout << best << 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 | #include "maklib.h" #include "message.h" #include <algorithm> #include <iostream> using namespace std; int main() { int n = Size(); const int N = NumberOfNodes(); const int ID = MyNodeId(); int len = (n + N - 1) / N; int beg = min(ID * len, n); int end = min((ID + 1) * len, n); if (beg == end) { PutChar(0, 'f'); // cerr << ID << ": " << "fail" << endl; } else { PutChar(0, 'w'); int sum = 0; int bestEnd = 0; int bestStart = 0; for (int i = beg; i < end; ++i) { int e = ElementAt(i+1); sum += e; bestEnd = max(bestEnd, sum); bestStart = min(bestStart, sum); } bestStart = sum - bestStart; int bestMid = sum; PutInt(0, bestStart); PutInt(0, bestMid); PutInt(0, bestEnd); // cerr << ID << ": " << "win: " << bestStart << ", " << bestMid << ", " << bestEnd << endl; } Send(0); if (ID == 0) { int bestStart[N]; int bestMid[N]; int bestEnd[N]; int liveNodes = N; for (int i = 0; i < N; ++i) { Receive(i); if ('w' == GetChar(i)) { bestStart[i] = GetInt(i); bestMid[i] = GetInt(i); bestEnd[i] = GetInt(i); } else { liveNodes = i; break; } } int best = 0; int current = 0; for (int i = 0; i < liveNodes; ++i) { best = max(best, current + bestEnd[i]); current = max(current + bestMid[i], bestStart[i]); } best = max(best, current); cout << best << endl; } return 0; } |
English