#include "krazki.h" #include "message.h" #include <vector> #include <cmath> #include <iostream> using namespace std; vector < long long > d_s, k_s; vector < int > d_h, k_n; int main() { int n = NumberOfNodes(); int ja=MyNodeId(), k = NumberOfDiscs(), h=PipeHeight(); long double H = h; int h_od = floor ((H * ja) / n) + 1; int h_do = floor ((H * (ja + 1)) / n); long double K = k; int k_od = floor ((K * ja) / n) + 1; int k_do = floor ((K * (ja + 1)) / n); int h_l = h_do - h_od + 1; int k_l = k_do - k_od + 1; long long x; long long min_d = 2000000000000000000l; for (int i = h_od; i <= h_do; i++) { x = HoleDiameter(i); if (x < min_d) { d_s.push_back(x); d_h.push_back(i); min_d = x; } } for (int i = 0; i < n; i++) { PutLL(i, min_d); Send(i); } //cout<<"wyslalem_grubosc: "<<min_d<<endl; //wysłano wiadomości z obsługiwanymi grubościami rury; long long najgrub = 0; long long h_najgrub = 0; for (int i = k_od; i <= k_do; i++) { x = DiscDiameter(i); if (x > najgrub) najgrub = x, h_najgrub = i; k_s.push_back(x); k_n.push_back(i); } //cout<<"moj_najgrub: "<<najgrub<<endl; long long grubosci[n]; for (int i = 0; i < n; i++) { Receive(i); grubosci[i] = GetLL(i); //cout<<"odebralem_od: "<<i<<" "<<grubosci[i]<<endl; } int adresat1 = n; for (int i = n - 1; i >= 0; i--) { if (grubosci [i] < najgrub) adresat1 = i; } int do1 = k+1; int do2 = k+1; int adresat2 = adresat1 + 1; if (adresat1 != n) { for (int i = k_l - 1; i >= 0; i--) { if (k_s[i] > grubosci[adresat1]) do1 = i + k_od; } if (adresat2 != n) { for (int i = do1 - k_od - 1; i >= 0; i--) { if (k_s[i] > grubosci[adresat2]) do2 = i + k_od; } } } //cout<<"adresaci: "<<adresat1<<" "<<adresat2<<endl; for (int i = 0; i < n; i++) { if (i == adresat1) { //cout<<"do "<<i<<" wysylam krazek"<<do1<<endl; PutInt(i, do1); } else if (i == adresat2) { //cout<<"do "<<i<<" wysylam krazek"<<do2<<endl; PutInt(i, do2); } else { PutInt(i, k+1); //cout<<"do "<<i<<" wysylam krazek"<<k+1<<endl; } Send(i); } int listy[n]; int najnizszy = k+1; for (int i = 0; i < n; i++) { Receive(i); listy[i] = GetInt(i); najnizszy = min(najnizszy, listy[i]); } //cout<<"moje_krazki: "<<listy[0]<<" "<<listy[1]<<endl; int stopien = d_s.size() - 1; int wysokosc = h_do; int klocek = najnizszy; //cout<<"najnizszy "<<najnizszy<<"xxx"<<endl; if (najnizszy == k+1) { PutInt(0, max (0, h - k + 1)); Send(0); //cout<<"wyslalem_raport"<<max (0, h - k + 1)<<endl; } else { bool przeczytaj = true; while (klocek <= k && wysokosc >= h_od ) { if (przeczytaj) x=DiscDiameter(klocek), przeczytaj = false; if (x <= d_s[stopien]) { klocek++; przeczytaj = true; wysokosc--; if (wysokosc == d_h[stopien]) { stopien--; } } else { wysokosc = d_h[stopien] - 1; stopien--; } //cout<<"stan: "<<klocek<<" "<<wysokosc<<" "<<stopien<<endl; } PutInt(0, max (0, wysokosc - (k - klocek))); Send(0); //cout<<"wyslalem_raport"<<max (0, wysokosc - (k - klocek))<<endl; } if (ja == 0) { int raporty[n]; int wynik = h; for (int i = 0; i < n; i++) { Receive(i); raporty[i]=GetInt(i); wynik = min (wynik, raporty[i]); } cout<<wynik; } 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 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | #include "krazki.h" #include "message.h" #include <vector> #include <cmath> #include <iostream> using namespace std; vector < long long > d_s, k_s; vector < int > d_h, k_n; int main() { int n = NumberOfNodes(); int ja=MyNodeId(), k = NumberOfDiscs(), h=PipeHeight(); long double H = h; int h_od = floor ((H * ja) / n) + 1; int h_do = floor ((H * (ja + 1)) / n); long double K = k; int k_od = floor ((K * ja) / n) + 1; int k_do = floor ((K * (ja + 1)) / n); int h_l = h_do - h_od + 1; int k_l = k_do - k_od + 1; long long x; long long min_d = 2000000000000000000l; for (int i = h_od; i <= h_do; i++) { x = HoleDiameter(i); if (x < min_d) { d_s.push_back(x); d_h.push_back(i); min_d = x; } } for (int i = 0; i < n; i++) { PutLL(i, min_d); Send(i); } //cout<<"wyslalem_grubosc: "<<min_d<<endl; //wysłano wiadomości z obsługiwanymi grubościami rury; long long najgrub = 0; long long h_najgrub = 0; for (int i = k_od; i <= k_do; i++) { x = DiscDiameter(i); if (x > najgrub) najgrub = x, h_najgrub = i; k_s.push_back(x); k_n.push_back(i); } //cout<<"moj_najgrub: "<<najgrub<<endl; long long grubosci[n]; for (int i = 0; i < n; i++) { Receive(i); grubosci[i] = GetLL(i); //cout<<"odebralem_od: "<<i<<" "<<grubosci[i]<<endl; } int adresat1 = n; for (int i = n - 1; i >= 0; i--) { if (grubosci [i] < najgrub) adresat1 = i; } int do1 = k+1; int do2 = k+1; int adresat2 = adresat1 + 1; if (adresat1 != n) { for (int i = k_l - 1; i >= 0; i--) { if (k_s[i] > grubosci[adresat1]) do1 = i + k_od; } if (adresat2 != n) { for (int i = do1 - k_od - 1; i >= 0; i--) { if (k_s[i] > grubosci[adresat2]) do2 = i + k_od; } } } //cout<<"adresaci: "<<adresat1<<" "<<adresat2<<endl; for (int i = 0; i < n; i++) { if (i == adresat1) { //cout<<"do "<<i<<" wysylam krazek"<<do1<<endl; PutInt(i, do1); } else if (i == adresat2) { //cout<<"do "<<i<<" wysylam krazek"<<do2<<endl; PutInt(i, do2); } else { PutInt(i, k+1); //cout<<"do "<<i<<" wysylam krazek"<<k+1<<endl; } Send(i); } int listy[n]; int najnizszy = k+1; for (int i = 0; i < n; i++) { Receive(i); listy[i] = GetInt(i); najnizszy = min(najnizszy, listy[i]); } //cout<<"moje_krazki: "<<listy[0]<<" "<<listy[1]<<endl; int stopien = d_s.size() - 1; int wysokosc = h_do; int klocek = najnizszy; //cout<<"najnizszy "<<najnizszy<<"xxx"<<endl; if (najnizszy == k+1) { PutInt(0, max (0, h - k + 1)); Send(0); //cout<<"wyslalem_raport"<<max (0, h - k + 1)<<endl; } else { bool przeczytaj = true; while (klocek <= k && wysokosc >= h_od ) { if (przeczytaj) x=DiscDiameter(klocek), przeczytaj = false; if (x <= d_s[stopien]) { klocek++; przeczytaj = true; wysokosc--; if (wysokosc == d_h[stopien]) { stopien--; } } else { wysokosc = d_h[stopien] - 1; stopien--; } //cout<<"stan: "<<klocek<<" "<<wysokosc<<" "<<stopien<<endl; } PutInt(0, max (0, wysokosc - (k - klocek))); Send(0); //cout<<"wyslalem_raport"<<max (0, wysokosc - (k - klocek))<<endl; } if (ja == 0) { int raporty[n]; int wynik = h; for (int i = 0; i < n; i++) { Receive(i); raporty[i]=GetInt(i); wynik = min (wynik, raporty[i]); } cout<<wynik; } return 0; } |