#include <algorithm> #include <iostream> #include "maklib.h" #include "message.h" using namespace std; long long best(int from, int to){ long long bes1=0; long long act=0; for(int i=from;i<=to;i++){ act+=ElementAt(i); if(act<0)act=0; if(act>bes1) bes1=act; } return bes1; } long long bestfirst(int from, int to){ long long bes1=0; long long act=0; for(int i=from;i<=to;i++){ act+=ElementAt(i); if(act>bes1) bes1=act; } return bes1; } long long bestlast(int from, int to){ long long bes1=0; long long act=0; for(int i=to;i>=from;i--){ act+=ElementAt(i); if(act>bes1) bes1=act; } return bes1; } long long sum(int from, int to){ long long act=0; for(int i=to;i>=from;i--){ act+=ElementAt(i); } return act; } int main() { int nodes = NumberOfNodes(); int mynode = MyNodeId(); int size = Size(); if(nodes>size) nodes=size; if(mynode>=nodes) return 0; int i,actp,actk,step; step = size/nodes; long long s1 = size; // algorytm zbierajacy long long acttill=0; long long actbest=0; // algorytm zbierajacy // for(i=0;i<nodes;i++) long long bestv; long long bestp; long long bestk; long long sumv; i=mynode; { actp=1+i*step; if(i!=nodes-1){ actk=(i+1)*step; } else{ actk=size; } // cout<<"("<<actp<<","<<actk<<")"<<endl; // cout<<"("<<best(actp,actk)<<")"<<"("<<bestfirst(actp,actk)<<")"<<"("<<bestlast(actp,actk)<<")"<<"("<<sum(actp,actk)<<")"<<endl; // ALGORYTM Zbierajacy bestv = best(actp,actk); bestp= bestfirst(actp,actk); bestk= bestlast(actp,actk); sumv= sum(actp,actk); } if (MyNodeId() > 0) { PutLL(0, bestv); PutLL(0, bestp); PutLL(0, bestk); PutLL(0, sumv); Send(0); } else { // MyNodeId == 0 if(actbest<bestv)actbest=bestv; // lokalny jest najlepszy if(actbest<acttill+bestp )actbest=acttill+bestp; // update acttilla if(acttill + sumv > bestk)acttill = acttill + sumv; else acttill = bestk; for (int instancja = 1; instancja < nodes; ++instancja) { Receive(instancja); bestv = GetLL(instancja); bestp= GetLL(instancja); bestk= GetLL(instancja); sumv= GetLL(instancja); if(actbest<bestv)actbest=bestv; // lokalny jest najlepszy if(actbest<acttill+bestp )actbest=acttill+bestp; // update acttilla if(acttill + sumv > bestk)acttill = acttill + sumv; else acttill = bestk; } cout<<actbest<<"\n"; } }
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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | #include <algorithm> #include <iostream> #include "maklib.h" #include "message.h" using namespace std; long long best(int from, int to){ long long bes1=0; long long act=0; for(int i=from;i<=to;i++){ act+=ElementAt(i); if(act<0)act=0; if(act>bes1) bes1=act; } return bes1; } long long bestfirst(int from, int to){ long long bes1=0; long long act=0; for(int i=from;i<=to;i++){ act+=ElementAt(i); if(act>bes1) bes1=act; } return bes1; } long long bestlast(int from, int to){ long long bes1=0; long long act=0; for(int i=to;i>=from;i--){ act+=ElementAt(i); if(act>bes1) bes1=act; } return bes1; } long long sum(int from, int to){ long long act=0; for(int i=to;i>=from;i--){ act+=ElementAt(i); } return act; } int main() { int nodes = NumberOfNodes(); int mynode = MyNodeId(); int size = Size(); if(nodes>size) nodes=size; if(mynode>=nodes) return 0; int i,actp,actk,step; step = size/nodes; long long s1 = size; // algorytm zbierajacy long long acttill=0; long long actbest=0; // algorytm zbierajacy // for(i=0;i<nodes;i++) long long bestv; long long bestp; long long bestk; long long sumv; i=mynode; { actp=1+i*step; if(i!=nodes-1){ actk=(i+1)*step; } else{ actk=size; } // cout<<"("<<actp<<","<<actk<<")"<<endl; // cout<<"("<<best(actp,actk)<<")"<<"("<<bestfirst(actp,actk)<<")"<<"("<<bestlast(actp,actk)<<")"<<"("<<sum(actp,actk)<<")"<<endl; // ALGORYTM Zbierajacy bestv = best(actp,actk); bestp= bestfirst(actp,actk); bestk= bestlast(actp,actk); sumv= sum(actp,actk); } if (MyNodeId() > 0) { PutLL(0, bestv); PutLL(0, bestp); PutLL(0, bestk); PutLL(0, sumv); Send(0); } else { // MyNodeId == 0 if(actbest<bestv)actbest=bestv; // lokalny jest najlepszy if(actbest<acttill+bestp )actbest=acttill+bestp; // update acttilla if(acttill + sumv > bestk)acttill = acttill + sumv; else acttill = bestk; for (int instancja = 1; instancja < nodes; ++instancja) { Receive(instancja); bestv = GetLL(instancja); bestp= GetLL(instancja); bestk= GetLL(instancja); sumv= GetLL(instancja); if(actbest<bestv)actbest=bestv; // lokalny jest najlepszy if(actbest<acttill+bestp )actbest=acttill+bestp; // update acttilla if(acttill + sumv > bestk)acttill = acttill + sumv; else acttill = bestk; } cout<<actbest<<"\n"; } } |