#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; } |
English