#include "kanapka.h"
#include "message.h"
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
struct Result {
long long sum;
long long minLeft, minRight;
long long minInside;
};
int main() {
int N = (int)GetN();
int id = MyNodeId();
int nodes = NumberOfNodes();
int rangeSize = ceil((double)N / (double)nodes);
int start = id * rangeSize;
int end = min(start + rangeSize, N);
long long sum = 0;
long long tempLeftSum = 0, tempRightSum = 0;
long long minLeft = 0, minRight = 0;
long long minInside = 0, tempInside = 0;
for(int i=start; i<end; i++){
long long t = GetTaste(i);
sum += t;
tempLeftSum += t;
if(tempLeftSum < minLeft)
minLeft = tempLeftSum;
if(tempInside < 0)
tempInside += t;
else
tempInside = t;
if(tempInside < minInside)
minInside = tempInside;
}
for(int i=end-1; i>=start; i--){
long long t = GetTaste(i);
tempRightSum += t;
if(tempRightSum < minRight)
minRight = tempRightSum;
}
// -------- gather ------------
if(id == 0){
Result *results = new Result[nodes];
long long sumAll = sum;
results[0].sum = sum;
results[0].minLeft = minLeft;
results[0].minRight = minRight;
results[0].minInside = minInside;
for(int i=1; i<nodes; i++){
Receive(i);
results[i].sum = GetLL(i);
results[i].minLeft = GetLL(i);
results[i].minRight = GetLL(i);
results[i].minInside = GetLL(i);
sumAll += results[i].sum;
}
long long best = max(0LL, sumAll);
for(int i=0; i<nodes; i++)
for(int k=i; k<nodes; k++){
if(k == i){
best = max(best, sumAll - results[i].minInside);
}else{
long long temp = results[i].minRight + results[k].minLeft;
for(int x=i+1; x<k; x++)
temp += results[x].sum;
best = max(best, sumAll - temp);
}
}
cout << best << endl;
delete [] results;
}else{
PutLL(0, sum);
PutLL(0, minLeft);
PutLL(0, minRight);
PutLL(0, minInside);
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 102 | #include "kanapka.h" #include "message.h" #include <algorithm> #include <iostream> #include <cmath> using namespace std; struct Result { long long sum; long long minLeft, minRight; long long minInside; }; int main() { int N = (int)GetN(); int id = MyNodeId(); int nodes = NumberOfNodes(); int rangeSize = ceil((double)N / (double)nodes); int start = id * rangeSize; int end = min(start + rangeSize, N); long long sum = 0; long long tempLeftSum = 0, tempRightSum = 0; long long minLeft = 0, minRight = 0; long long minInside = 0, tempInside = 0; for(int i=start; i<end; i++){ long long t = GetTaste(i); sum += t; tempLeftSum += t; if(tempLeftSum < minLeft) minLeft = tempLeftSum; if(tempInside < 0) tempInside += t; else tempInside = t; if(tempInside < minInside) minInside = tempInside; } for(int i=end-1; i>=start; i--){ long long t = GetTaste(i); tempRightSum += t; if(tempRightSum < minRight) minRight = tempRightSum; } // -------- gather ------------ if(id == 0){ Result *results = new Result[nodes]; long long sumAll = sum; results[0].sum = sum; results[0].minLeft = minLeft; results[0].minRight = minRight; results[0].minInside = minInside; for(int i=1; i<nodes; i++){ Receive(i); results[i].sum = GetLL(i); results[i].minLeft = GetLL(i); results[i].minRight = GetLL(i); results[i].minInside = GetLL(i); sumAll += results[i].sum; } long long best = max(0LL, sumAll); for(int i=0; i<nodes; i++) for(int k=i; k<nodes; k++){ if(k == i){ best = max(best, sumAll - results[i].minInside); }else{ long long temp = results[i].minRight + results[k].minLeft; for(int x=i+1; x<k; x++) temp += results[x].sum; best = max(best, sumAll - temp); } } cout << best << endl; delete [] results; }else{ PutLL(0, sum); PutLL(0, minLeft); PutLL(0, minRight); PutLL(0, minInside); Send(0); } return 0; } |
polski