#include "kanapka.h"
#include "message.h"
#include <algorithm>
#include <iostream>
#define LL long long
#define MAX_NODES 100
using namespace std;
struct packet
{
LL sum, left, right, left_max, right_max;
};
int main()
{
ios::sync_with_stdio(0);
int myNode = MyNodeId();
int nodesCount = NumberOfNodes();
long long n = GetN();
long long step = n / (double)nodesCount + 0.5;
if (step < 2)
step = 2;
nodesCount = n > 1000 ? n / (double)step + 0.5 : 1;
if (myNode >= nodesCount) return 0;
// split work
LL from, to;
from = myNode*step;
to = (myNode + 1) * step;
if (myNode == nodesCount - 1) to = n;
// solve
LL leftMin = 0, rightMin = 0, sumAll = 0, minPiece = 0, leftMax = 0;
for (LL i = from; i < to; i++)
{
sumAll += GetTaste(i);
if (sumAll < leftMin) leftMin = sumAll;
if (sumAll > leftMax) leftMax = sumAll;
if (sumAll - leftMax < minPiece) minPiece = sumAll - leftMax;
}
rightMin = sumAll - leftMax;
if (myNode != 0)
{
PutLL(0, sumAll);
PutLL(0, leftMin);
PutLL(0, rightMin);
PutLL(0, minPiece);
Send(0);
return 0;
}
LL nLeftMin, nRightMin, nSumAll, nMinPiece;
for (int i = 1; i < nodesCount; i++)
{
Receive(i);
nSumAll = GetLL(i);
nLeftMin = GetLL(i);
nRightMin = GetLL(i);
nMinPiece = GetLL(i);
minPiece = std::min(std::min(nMinPiece, minPiece), rightMin + nLeftMin);
sumAll += nSumAll;
rightMin = std::min(nSumAll + rightMin, nRightMin);
}
cout << sumAll - minPiece;
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 | #include "kanapka.h" #include "message.h" #include <algorithm> #include <iostream> #define LL long long #define MAX_NODES 100 using namespace std; struct packet { LL sum, left, right, left_max, right_max; }; int main() { ios::sync_with_stdio(0); int myNode = MyNodeId(); int nodesCount = NumberOfNodes(); long long n = GetN(); long long step = n / (double)nodesCount + 0.5; if (step < 2) step = 2; nodesCount = n > 1000 ? n / (double)step + 0.5 : 1; if (myNode >= nodesCount) return 0; // split work LL from, to; from = myNode*step; to = (myNode + 1) * step; if (myNode == nodesCount - 1) to = n; // solve LL leftMin = 0, rightMin = 0, sumAll = 0, minPiece = 0, leftMax = 0; for (LL i = from; i < to; i++) { sumAll += GetTaste(i); if (sumAll < leftMin) leftMin = sumAll; if (sumAll > leftMax) leftMax = sumAll; if (sumAll - leftMax < minPiece) minPiece = sumAll - leftMax; } rightMin = sumAll - leftMax; if (myNode != 0) { PutLL(0, sumAll); PutLL(0, leftMin); PutLL(0, rightMin); PutLL(0, minPiece); Send(0); return 0; } LL nLeftMin, nRightMin, nSumAll, nMinPiece; for (int i = 1; i < nodesCount; i++) { Receive(i); nSumAll = GetLL(i); nLeftMin = GetLL(i); nRightMin = GetLL(i); nMinPiece = GetLL(i); minPiece = std::min(std::min(nMinPiece, minPiece), rightMin + nLeftMin); sumAll += nSumAll; rightMin = std::min(nSumAll + rightMin, nRightMin); } cout << sumAll - minPiece; return 0; } |
English