#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
                    English