#include "kanapka.h" #include "message.h" #include <algorithm> #include <iostream> using namespace std; int suma(long long sumarr[], int from, int too) { long long ans = 0; for (int i=from; i<=too; i++){ ans+=sumarr[i]; } return ans; } int main() { long long N = GetN(); int nodes = NumberOfNodes(); long long sum = 0ll; long long MIN = -10000000000ll, MAX = 10000000000ll; long long prefix_max = 0ll; long long prefix_min = 0ll; long long suffix_min = 0ll; long long inner_min = 0; long long poczatek = (MyNodeId() * N) / nodes; long long koniec = ((MyNodeId() + 1) * N) / nodes; /*if (MyNodeId() == 0) { for (int i=0; i<N; i++){ cout << GetTaste(i) << " "; } cout << endl; }*/ // Faza pierwsza. long long inner = 0; for (long long i = poczatek; i < koniec; ++i) { long long taste = GetTaste(i); sum = sum + taste; prefix_max = max(prefix_max, sum); prefix_min = min(prefix_min, sum); inner = min(0ll, inner + taste); inner_min = min(inner_min, inner); } suffix_min = sum - prefix_max; //cout <<"Node "<<MyNodeId()<<" from: "<<poczatek<<" to: "<<koniec<<" sum: "<<sum<<" prefix_min: "<<prefix_min<<" suffix_min: "<<suffix_min<<" inner_min: "<<inner_min<<endl; if (MyNodeId() > 0) { PutLL(0, sum); PutLL(0, prefix_min); PutLL(0, suffix_min); PutLL(0, inner_min); //cout << "Node "+MyNodeId()" wysyla dane : from: "+poczatek <<", to: "+koniec <<",sum : " + sum << ", pmin : " + prefix_min << ", smin: " + suffix_min <<endl; Send(0); } else { long long sumarr[nodes]; long long prefixes[nodes]; long long suffixes[nodes]; long long inners[nodes]; sumarr[0] = sum; prefixes[0] = prefix_min; suffixes[0] = suffix_min; inners[0] = inner_min; long long all = sumarr[0]; for (int i=1; i<nodes; ++i){ int instancja = Receive(-1); sumarr[instancja] = GetLL(instancja); prefixes[instancja] = GetLL(instancja); suffixes[instancja] = GetLL(instancja); inners[instancja] = GetLL(instancja); all += sumarr[instancja]; } long long worse = MAX; for (int a = 0; a<nodes; a++){ for (int b = a + 1; b<nodes; b++){ worse = min(worse, suffixes[a] + suma(sumarr, a+1, b-1) + prefixes[b]); } worse = min(worse, inners[a]); worse = min(worse, prefixes[a]); worse = min(worse, suffixes[a]); } worse = min(worse, suffixes[nodes-1]); cout << (all - worse) << 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 | #include "kanapka.h" #include "message.h" #include <algorithm> #include <iostream> using namespace std; int suma(long long sumarr[], int from, int too) { long long ans = 0; for (int i=from; i<=too; i++){ ans+=sumarr[i]; } return ans; } int main() { long long N = GetN(); int nodes = NumberOfNodes(); long long sum = 0ll; long long MIN = -10000000000ll, MAX = 10000000000ll; long long prefix_max = 0ll; long long prefix_min = 0ll; long long suffix_min = 0ll; long long inner_min = 0; long long poczatek = (MyNodeId() * N) / nodes; long long koniec = ((MyNodeId() + 1) * N) / nodes; /*if (MyNodeId() == 0) { for (int i=0; i<N; i++){ cout << GetTaste(i) << " "; } cout << endl; }*/ // Faza pierwsza. long long inner = 0; for (long long i = poczatek; i < koniec; ++i) { long long taste = GetTaste(i); sum = sum + taste; prefix_max = max(prefix_max, sum); prefix_min = min(prefix_min, sum); inner = min(0ll, inner + taste); inner_min = min(inner_min, inner); } suffix_min = sum - prefix_max; //cout <<"Node "<<MyNodeId()<<" from: "<<poczatek<<" to: "<<koniec<<" sum: "<<sum<<" prefix_min: "<<prefix_min<<" suffix_min: "<<suffix_min<<" inner_min: "<<inner_min<<endl; if (MyNodeId() > 0) { PutLL(0, sum); PutLL(0, prefix_min); PutLL(0, suffix_min); PutLL(0, inner_min); //cout << "Node "+MyNodeId()" wysyla dane : from: "+poczatek <<", to: "+koniec <<",sum : " + sum << ", pmin : " + prefix_min << ", smin: " + suffix_min <<endl; Send(0); } else { long long sumarr[nodes]; long long prefixes[nodes]; long long suffixes[nodes]; long long inners[nodes]; sumarr[0] = sum; prefixes[0] = prefix_min; suffixes[0] = suffix_min; inners[0] = inner_min; long long all = sumarr[0]; for (int i=1; i<nodes; ++i){ int instancja = Receive(-1); sumarr[instancja] = GetLL(instancja); prefixes[instancja] = GetLL(instancja); suffixes[instancja] = GetLL(instancja); inners[instancja] = GetLL(instancja); all += sumarr[instancja]; } long long worse = MAX; for (int a = 0; a<nodes; a++){ for (int b = a + 1; b<nodes; b++){ worse = min(worse, suffixes[a] + suma(sumarr, a+1, b-1) + prefixes[b]); } worse = min(worse, inners[a]); worse = min(worse, prefixes[a]); worse = min(worse, suffixes[a]); } worse = min(worse, suffixes[nodes-1]); cout << (all - worse) << endl; } return 0; } |