#include "maklib.h" #include "message.h" #include <iostream> using namespace std; int main(){ int liczbaElementow = Size(); int ileInstancji = NumberOfNodes(); int poIle = Size()/ ileInstancji; if(poIle==0)poIle=1; int mojeID = MyNodeId(); long long max = 0; long long dotychczas = 0; long long start = 0; long long left = 0; long long maxLeft; long long right = 0; long long maxRight = 0; long long all = 0; long long el; if(mojeID+1 != ileInstancji){ for(int i= mojeID*poIle; i< (mojeID+1)*poIle; i++){ el =ElementAt(i+1) ; if(el+ dotychczas > max) max = el + dotychczas; if(dotychczas + el >= 0) dotychczas+= el; if(dotychczas + el < 0) dotychczas = 0; left+=el; if(left>maxLeft)maxLeft = left; all+=el; } for(int i= (mojeID+1)*poIle-1; i>=mojeID*poIle; i--){ right+=ElementAt(i+1); if(right>maxRight)maxRight = right; } }else{ for(int i= mojeID*poIle; i< liczbaElementow; i++){ el =ElementAt(i+1) ; if(el+ dotychczas > max) max = el + dotychczas; if(dotychczas + el >= 0) dotychczas+= el; if(dotychczas + el < 0) dotychczas = 0; left+=el; if(left>maxLeft)maxLeft = left; all+=el; } for(int i= liczbaElementow-1; i>= mojeID*poIle; i--){ right+=ElementAt(i+1); if(right>maxRight)maxRight = right; } } if (mojeID+1 != ileInstancji) { PutLL(ileInstancji-1, max); PutLL(ileInstancji-1, maxLeft); PutLL(ileInstancji-1, maxRight); PutLL(ileInstancji-1, all); Send(0); } else { Receive(0); long long max0 = GetLL(0); long long left0 = GetLL(0); long long right0 = GetLL(0); long long all0 = GetLL(0); long long MAX = max0; long long max1 ; long long left1; long long right1; long long all1; for (int instancja = 1; instancja < NumberOfNodes()-1; ++instancja) { Receive(instancja); max1 = GetLL(instancja); left1 = GetLL(instancja); right1 = GetLL(instancja); all1 = GetLL(instancja); if(MAX<max1)MAX = max1; if(MAX<right0+left0)MAX=right0+left0; } if(MAX<max)MAX=max; if(MAX<right0+maxLeft)MAX=right0+maxLeft; cout<<MAX<<"\n"; } 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 | #include "maklib.h" #include "message.h" #include <iostream> using namespace std; int main(){ int liczbaElementow = Size(); int ileInstancji = NumberOfNodes(); int poIle = Size()/ ileInstancji; if(poIle==0)poIle=1; int mojeID = MyNodeId(); long long max = 0; long long dotychczas = 0; long long start = 0; long long left = 0; long long maxLeft; long long right = 0; long long maxRight = 0; long long all = 0; long long el; if(mojeID+1 != ileInstancji){ for(int i= mojeID*poIle; i< (mojeID+1)*poIle; i++){ el =ElementAt(i+1) ; if(el+ dotychczas > max) max = el + dotychczas; if(dotychczas + el >= 0) dotychczas+= el; if(dotychczas + el < 0) dotychczas = 0; left+=el; if(left>maxLeft)maxLeft = left; all+=el; } for(int i= (mojeID+1)*poIle-1; i>=mojeID*poIle; i--){ right+=ElementAt(i+1); if(right>maxRight)maxRight = right; } }else{ for(int i= mojeID*poIle; i< liczbaElementow; i++){ el =ElementAt(i+1) ; if(el+ dotychczas > max) max = el + dotychczas; if(dotychczas + el >= 0) dotychczas+= el; if(dotychczas + el < 0) dotychczas = 0; left+=el; if(left>maxLeft)maxLeft = left; all+=el; } for(int i= liczbaElementow-1; i>= mojeID*poIle; i--){ right+=ElementAt(i+1); if(right>maxRight)maxRight = right; } } if (mojeID+1 != ileInstancji) { PutLL(ileInstancji-1, max); PutLL(ileInstancji-1, maxLeft); PutLL(ileInstancji-1, maxRight); PutLL(ileInstancji-1, all); Send(0); } else { Receive(0); long long max0 = GetLL(0); long long left0 = GetLL(0); long long right0 = GetLL(0); long long all0 = GetLL(0); long long MAX = max0; long long max1 ; long long left1; long long right1; long long all1; for (int instancja = 1; instancja < NumberOfNodes()-1; ++instancja) { Receive(instancja); max1 = GetLL(instancja); left1 = GetLL(instancja); right1 = GetLL(instancja); all1 = GetLL(instancja); if(MAX<max1)MAX = max1; if(MAX<right0+left0)MAX=right0+left0; } if(MAX<max)MAX=max; if(MAX<right0+maxLeft)MAX=right0+maxLeft; cout<<MAX<<"\n"; } return 0; } |