#include <iostream> #include "message.h" #include "teatr.h" #include <vector> using namespace std; int main() { int L = GetN(); // dlugosc danych int N = NumberOfNodes(); const int max_wzrost = 4; // maksymalny wzrost-1 - zakladamy wzrost<=5 !!! vector<uint32_t> zliczenia(max_wzrost, 0); // zlicz kolejno (wzrost-1) >0, >1, >2, >3 if (MyNodeId()>0) { //dzielimy dane na L przedzialow, zliczenia w przedzialach od 0 do L-1 for (int ii = (MyNodeId()-1)*L/N; ii<MyNodeId()*L/N; ii++) { int wzrost = GetElement(ii)-1; //(wzrost-1) nalezy do {0,1,2,3,4} for (int z = 0; z<4; z++) { if (wzrost>z) zliczenia[z]++; } } for (int z=0; z<4; z++) { PutInt(0, zliczenia[z]); } Send(0); //odbierz sumy skumulowane od instatcji nr 0 Receive(0); for (int z=0; z<4; z++) { int temp = GetInt(0); zliczenia[z]=temp; } } else // MyNodeId()==0 { // zlicz sumy skumulowane z przedzialow od przed_0 do przed_L (L-1) vector<vector<uint32_t>> sumy_kumul; sumy_kumul.push_back(zliczenia); // same zera - suma dla przed_0 for (int id = 1; id<N; id++) { Receive(id); sumy_kumul.push_back(zliczenia); for (int z=0; z<4; z++) { int temp = GetInt(id); sumy_kumul[id][z] = temp + sumy_kumul[id-1][z]; // Uwaga! kumulacja sum korzysta z kolejnosci czytania! } } // wyslij instancjom sumy skumulowane for (int id = 1; id<N; id++) { for (int z=0; z<4; z++) { PutInt(id, sumy_kumul[id][z]); } Send(id); } } // policz klotnie na podprzedzialach long long klotnie = 0; for (int ii = MyNodeId()*L/N; ii<(MyNodeId()+1)*L/N; ii++) { // posiadamy tablice zliczen el.>a (a=1,2,3,4) na wszystkich // podprzedzialach wczesniejszych niz obecny // liczymy klotnie i uzupelniamy tablice na biezaco o nowe zliczenia int wzrost = GetElement(ii)-1; if (wzrost<max_wzrost) klotnie += zliczenia[wzrost]; for (int z = 0; z<4; z++) if (wzrost>z) zliczenia[z]++; } // policz calkowita liczbe klotni if (MyNodeId()>0) { PutLL(0, klotnie); Send(0); } else //MyNodeId()==0 { for (int id = 1; id<N; id++) { Receive(id); long long temp = GetLL(id); klotnie +=temp; } cout<<klotnie<<endl; } 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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | #include <iostream> #include "message.h" #include "teatr.h" #include <vector> using namespace std; int main() { int L = GetN(); // dlugosc danych int N = NumberOfNodes(); const int max_wzrost = 4; // maksymalny wzrost-1 - zakladamy wzrost<=5 !!! vector<uint32_t> zliczenia(max_wzrost, 0); // zlicz kolejno (wzrost-1) >0, >1, >2, >3 if (MyNodeId()>0) { //dzielimy dane na L przedzialow, zliczenia w przedzialach od 0 do L-1 for (int ii = (MyNodeId()-1)*L/N; ii<MyNodeId()*L/N; ii++) { int wzrost = GetElement(ii)-1; //(wzrost-1) nalezy do {0,1,2,3,4} for (int z = 0; z<4; z++) { if (wzrost>z) zliczenia[z]++; } } for (int z=0; z<4; z++) { PutInt(0, zliczenia[z]); } Send(0); //odbierz sumy skumulowane od instatcji nr 0 Receive(0); for (int z=0; z<4; z++) { int temp = GetInt(0); zliczenia[z]=temp; } } else // MyNodeId()==0 { // zlicz sumy skumulowane z przedzialow od przed_0 do przed_L (L-1) vector<vector<uint32_t>> sumy_kumul; sumy_kumul.push_back(zliczenia); // same zera - suma dla przed_0 for (int id = 1; id<N; id++) { Receive(id); sumy_kumul.push_back(zliczenia); for (int z=0; z<4; z++) { int temp = GetInt(id); sumy_kumul[id][z] = temp + sumy_kumul[id-1][z]; // Uwaga! kumulacja sum korzysta z kolejnosci czytania! } } // wyslij instancjom sumy skumulowane for (int id = 1; id<N; id++) { for (int z=0; z<4; z++) { PutInt(id, sumy_kumul[id][z]); } Send(id); } } // policz klotnie na podprzedzialach long long klotnie = 0; for (int ii = MyNodeId()*L/N; ii<(MyNodeId()+1)*L/N; ii++) { // posiadamy tablice zliczen el.>a (a=1,2,3,4) na wszystkich // podprzedzialach wczesniejszych niz obecny // liczymy klotnie i uzupelniamy tablice na biezaco o nowe zliczenia int wzrost = GetElement(ii)-1; if (wzrost<max_wzrost) klotnie += zliczenia[wzrost]; for (int z = 0; z<4; z++) if (wzrost>z) zliczenia[z]++; } // policz calkowita liczbe klotni if (MyNodeId()>0) { PutLL(0, klotnie); Send(0); } else //MyNodeId()==0 { for (int id = 1; id<N; id++) { Receive(id); long long temp = GetLL(id); klotnie +=temp; } cout<<klotnie<<endl; } return 0; } |