#include <iostream> #include <cstdio> #include "message.h" #include "kanapka.h" using namespace std; int n, kompy, ID, poczatek, koniec; long long a, suma, prefiks, sufiks, result, wynik, RES, WYN; long long sumy[105]; long long prefiksy[105]; long long sufiksy[105]; long long resulty[105]; long long lewe[105]; long long prawe[105]; int main () { n = GetN(); kompy = NumberOfNodes(); ID = MyNodeId(); poczatek = (n / kompy) * ID; koniec = (n / kompy) * (ID + 1); if (ID == kompy - 1) koniec = n; for (int i = poczatek; i < koniec; ++i) { a = GetTaste(i); suma += a; if (suma > prefiks) prefiks = suma; wynik += a; if (wynik < result) result = wynik; if (wynik > 0) wynik = 0; } result = suma - result; wynik = 0; for (int i = koniec - 1; i >= poczatek; --i) { a = GetTaste(i); wynik += a; if (wynik > sufiks) sufiks = wynik; } PutLL(0, suma); PutLL(0, prefiks); PutLL(0, sufiks); PutLL(0, result); Send(0); if (ID == 0) { for (int i = 0; i < kompy; ++i) { Receive(i); sumy[i] = GetLL(i); prefiksy[i] = GetLL(i); sufiksy[i] = GetLL(i); resulty[i] = GetLL(i); } lewe[0] = sumy[0]; for (int i = 1; i < kompy; ++i) lewe[i] = lewe[i - 1] + sumy[i]; prawe[kompy - 1] = sumy[kompy - 1]; for (int i = kompy - 2; i >= 0; --i) prawe[i] = prawe[i + 1] + sumy[i]; for (int i = 0; i < kompy; ++i) for (int j = i + 1; j < kompy; ++j) { WYN = prefiksy[i] + sufiksy[j]; if (i != 0) WYN = lewe[i - 1]; if (j != kompy - 1) WYN += prawe[j + 1]; if (WYN > RES) RES = WYN; } for (int i = 0; i < kompy; ++i) { WYN = resulty[i]; if (i != 0) WYN += lewe[i - 1]; if (i != kompy - 1) WYN += prawe[i + 1]; if (WYN > RES) RES = WYN; } printf("%lld\n", RES); } 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 | #include <iostream> #include <cstdio> #include "message.h" #include "kanapka.h" using namespace std; int n, kompy, ID, poczatek, koniec; long long a, suma, prefiks, sufiks, result, wynik, RES, WYN; long long sumy[105]; long long prefiksy[105]; long long sufiksy[105]; long long resulty[105]; long long lewe[105]; long long prawe[105]; int main () { n = GetN(); kompy = NumberOfNodes(); ID = MyNodeId(); poczatek = (n / kompy) * ID; koniec = (n / kompy) * (ID + 1); if (ID == kompy - 1) koniec = n; for (int i = poczatek; i < koniec; ++i) { a = GetTaste(i); suma += a; if (suma > prefiks) prefiks = suma; wynik += a; if (wynik < result) result = wynik; if (wynik > 0) wynik = 0; } result = suma - result; wynik = 0; for (int i = koniec - 1; i >= poczatek; --i) { a = GetTaste(i); wynik += a; if (wynik > sufiks) sufiks = wynik; } PutLL(0, suma); PutLL(0, prefiks); PutLL(0, sufiks); PutLL(0, result); Send(0); if (ID == 0) { for (int i = 0; i < kompy; ++i) { Receive(i); sumy[i] = GetLL(i); prefiksy[i] = GetLL(i); sufiksy[i] = GetLL(i); resulty[i] = GetLL(i); } lewe[0] = sumy[0]; for (int i = 1; i < kompy; ++i) lewe[i] = lewe[i - 1] + sumy[i]; prawe[kompy - 1] = sumy[kompy - 1]; for (int i = kompy - 2; i >= 0; --i) prawe[i] = prawe[i + 1] + sumy[i]; for (int i = 0; i < kompy; ++i) for (int j = i + 1; j < kompy; ++j) { WYN = prefiksy[i] + sufiksy[j]; if (i != 0) WYN = lewe[i - 1]; if (j != kompy - 1) WYN += prawe[j + 1]; if (WYN > RES) RES = WYN; } for (int i = 0; i < kompy; ++i) { WYN = resulty[i]; if (i != 0) WYN += lewe[i - 1]; if (i != kompy - 1) WYN += prawe[i + 1]; if (WYN > RES) RES = WYN; } printf("%lld\n", RES); } return 0; } |