#include <iostream> #include "message.h" #include "kanapka.h" using namespace std; int main(){ auto tot_elem = GetN(); auto tot_nodes = NumberOfNodes(); auto this_node = MyNodeId(); auto elem_per_node = tot_elem/tot_nodes + 1; long long begin = this_node * elem_per_node; long long end = begin + elem_per_node; if(end > tot_elem) end = tot_elem; //cout<<begin<<" "<<end<<endl; const int master_node_id = 0; if(begin >= tot_elem){ if(this_node != master_node_id){ char is_node_active = 0; PutChar(master_node_id, is_node_active); PutLL(master_node_id, 0); Send(master_node_id); } return 0; } //long long diag = 0; long long left_sum = 0, right_sum = 0; for(long long i = 0; i <= begin; ++i){ left_sum += GetTaste(i); //++diag; } long long max_sum = left_sum; while(true){ right_sum = 0; for(long long i = tot_elem - 1; i >= end; --i){ //++diag; right_sum += GetTaste(i); if(right_sum>max_sum) max_sum = right_sum; if(left_sum + right_sum>max_sum) max_sum = left_sum + right_sum; } if(left_sum>max_sum) max_sum = left_sum; ++begin; if(begin>=end) break; left_sum += GetTaste(begin); } //cout<<"diag: "<<diag<<endl; if(this_node == master_node_id){ for(int i = 0; i<tot_nodes-1; ++i){ int sender = Receive(-1); //cout<<"receiving from "<<sender<<endl; bool is_node_active = GetChar(sender); long long node_max_sum = GetLL(sender); if(!is_node_active){ //cout<<"node "<<sender<<" inactive"<<endl; continue; } //cout<<"node_max_sum sum: "<<node_max_sum<<endl; if(node_max_sum > max_sum) max_sum = node_max_sum; } //cout<<"MAX SUM: "<<max_sum<<endl; cout<<max_sum<<endl; } else{ //cout<<"sending to master "<<endl; char is_node_active = 1; PutChar(master_node_id, is_node_active); PutLL(master_node_id, max_sum); Send(master_node_id); } }
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 | #include <iostream> #include "message.h" #include "kanapka.h" using namespace std; int main(){ auto tot_elem = GetN(); auto tot_nodes = NumberOfNodes(); auto this_node = MyNodeId(); auto elem_per_node = tot_elem/tot_nodes + 1; long long begin = this_node * elem_per_node; long long end = begin + elem_per_node; if(end > tot_elem) end = tot_elem; //cout<<begin<<" "<<end<<endl; const int master_node_id = 0; if(begin >= tot_elem){ if(this_node != master_node_id){ char is_node_active = 0; PutChar(master_node_id, is_node_active); PutLL(master_node_id, 0); Send(master_node_id); } return 0; } //long long diag = 0; long long left_sum = 0, right_sum = 0; for(long long i = 0; i <= begin; ++i){ left_sum += GetTaste(i); //++diag; } long long max_sum = left_sum; while(true){ right_sum = 0; for(long long i = tot_elem - 1; i >= end; --i){ //++diag; right_sum += GetTaste(i); if(right_sum>max_sum) max_sum = right_sum; if(left_sum + right_sum>max_sum) max_sum = left_sum + right_sum; } if(left_sum>max_sum) max_sum = left_sum; ++begin; if(begin>=end) break; left_sum += GetTaste(begin); } //cout<<"diag: "<<diag<<endl; if(this_node == master_node_id){ for(int i = 0; i<tot_nodes-1; ++i){ int sender = Receive(-1); //cout<<"receiving from "<<sender<<endl; bool is_node_active = GetChar(sender); long long node_max_sum = GetLL(sender); if(!is_node_active){ //cout<<"node "<<sender<<" inactive"<<endl; continue; } //cout<<"node_max_sum sum: "<<node_max_sum<<endl; if(node_max_sum > max_sum) max_sum = node_max_sum; } //cout<<"MAX SUM: "<<max_sum<<endl; cout<<max_sum<<endl; } else{ //cout<<"sending to master "<<endl; char is_node_active = 1; PutChar(master_node_id, is_node_active); PutLL(master_node_id, max_sum); Send(master_node_id); } } |