#include "maklib.h" #include "message.h" #include <stdio.h> #define MIN_ROZPR 10 #define MAKS_WEZ 100 int main() { long long suma, suma_pocz, suma_maks, suma_kon, pocz, kon, wez_pocz[MAKS_WEZ], wez_kon[MAKS_WEZ], wez_maks[MAKS_WEZ], wez_suma[MAKS_WEZ]; int i, j, licz, n, licz_wez, nr_wez, czy_rozpr; licz_wez = NumberOfNodes(); nr_wez = MyNodeId(); n = Size(); czy_rozpr = n / licz_wez >= MIN_ROZPR; if (czy_rozpr || nr_wez == 0) { suma = suma_pocz = suma_maks = suma_kon = 0; if (czy_rozpr) { pocz = nr_wez * n / licz_wez + 1; kon = (nr_wez + 1) * n / licz_wez; } else { pocz = 1; kon = n; } for (i = pocz; i <= kon; i++) { licz = ElementAt(i); suma += licz; if (suma > suma_pocz) suma_pocz = suma; if (suma_kon < 0 && licz > 0) suma_kon = licz; else suma_kon += licz; if (suma_kon > suma_maks) suma_maks = suma_kon; } if (czy_rozpr) { if (nr_wez > 0) { PutLL(0, suma_pocz); PutLL(0, suma_maks); PutLL(0, suma); PutLL(0, suma_kon); Send(0); } else { for (i = 1; i < licz_wez; i++) { j = Receive(-1); wez_pocz[j] = GetLL(j); wez_maks[j] = GetLL(j); wez_suma[j] = GetLL(j); wez_kon[j] = GetLL(j); } for (i = 1; i < licz_wez; i++) { if (suma_kon > suma) suma = suma_kon; if (wez_maks[i] > suma_maks) suma_maks = wez_maks[i]; if (suma + wez_pocz[i] > suma_maks) suma_maks = suma + wez_pocz[i]; if (suma + wez_suma[i] > wez_kon[i]) { suma += wez_suma[i]; if (suma > suma_maks) suma_maks = suma; } else suma = wez_kon[i]; suma_kon = wez_kon[i]; } } } if (nr_wez == 0) printf("%lld\n", suma_maks); } 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 | #include "maklib.h" #include "message.h" #include <stdio.h> #define MIN_ROZPR 10 #define MAKS_WEZ 100 int main() { long long suma, suma_pocz, suma_maks, suma_kon, pocz, kon, wez_pocz[MAKS_WEZ], wez_kon[MAKS_WEZ], wez_maks[MAKS_WEZ], wez_suma[MAKS_WEZ]; int i, j, licz, n, licz_wez, nr_wez, czy_rozpr; licz_wez = NumberOfNodes(); nr_wez = MyNodeId(); n = Size(); czy_rozpr = n / licz_wez >= MIN_ROZPR; if (czy_rozpr || nr_wez == 0) { suma = suma_pocz = suma_maks = suma_kon = 0; if (czy_rozpr) { pocz = nr_wez * n / licz_wez + 1; kon = (nr_wez + 1) * n / licz_wez; } else { pocz = 1; kon = n; } for (i = pocz; i <= kon; i++) { licz = ElementAt(i); suma += licz; if (suma > suma_pocz) suma_pocz = suma; if (suma_kon < 0 && licz > 0) suma_kon = licz; else suma_kon += licz; if (suma_kon > suma_maks) suma_maks = suma_kon; } if (czy_rozpr) { if (nr_wez > 0) { PutLL(0, suma_pocz); PutLL(0, suma_maks); PutLL(0, suma); PutLL(0, suma_kon); Send(0); } else { for (i = 1; i < licz_wez; i++) { j = Receive(-1); wez_pocz[j] = GetLL(j); wez_maks[j] = GetLL(j); wez_suma[j] = GetLL(j); wez_kon[j] = GetLL(j); } for (i = 1; i < licz_wez; i++) { if (suma_kon > suma) suma = suma_kon; if (wez_maks[i] > suma_maks) suma_maks = wez_maks[i]; if (suma + wez_pocz[i] > suma_maks) suma_maks = suma + wez_pocz[i]; if (suma + wez_suma[i] > wez_kon[i]) { suma += wez_suma[i]; if (suma > suma_maks) suma_maks = suma; } else suma = wez_kon[i]; suma_kon = wez_kon[i]; } } } if (nr_wez == 0) printf("%lld\n", suma_maks); } return 0; } |