#include <cstdio> #include "message.h" #include "kanapka.h" typedef long long ll; int main() { // This node will cover the range [beg, end). ll beg = (GetN() * MyNodeId()) / NumberOfNodes(); ll end = (GetN() * (MyNodeId() + 1)) / NumberOfNodes(); // Instead of looking for the tastiest prefix and suffix, we look for the // least tasty interior. ll sum = 0LL; // Sum of all elements in the range ll prefix = 0LL; // The least tasty prefix of the range ll interior = 0LL; // The least tasty interior within the range ll suffix = 0LL; // The least tasty suffix of the range. for (ll i = beg; i < end; ++i) { sum += GetTaste(i); suffix += GetTaste(i); if (suffix > 0LL) suffix = 0LL; interior = (suffix < interior) ? suffix : interior; prefix = (sum < prefix) ? sum : prefix; } // Send the four numbers to the master node. PutLL(0, sum); PutLL(0, prefix); PutLL(0, interior); PutLL(0, suffix); Send(0); if (MyNodeId() == 0) { // Gather all the information from all the nodes. ll all_sums[100]; ll all_prefixes[100]; ll all_interiors[100]; ll all_suffixes[100]; for (int i = 0; i < NumberOfNodes(); ++i) { int node = Receive(-1); all_sums[node] = GetLL(node); all_prefixes[node] = GetLL(node); all_interiors[node] = GetLL(node); all_suffixes[node] = GetLL(node); } // Now we do almost the same calculation to find the best overall interior. sum = interior = suffix = 0LL; for (int i = 0; i < NumberOfNodes(); ++i) { // The interior of the i-th node is a candidate for the worst interior. interior = (interior < all_interiors[i]) ? interior : all_interiors[i]; // Also, something from the previous nodes, plus a prefix of this node. interior = (interior < suffix + all_prefixes[i]) ? interior : suffix + all_prefixes[i]; // The suffix is either just contained in this node, or it's all of this // node and a suffix of the rest. suffix = (all_suffixes[i] < all_sums[i] + suffix) ? all_suffixes[i] : all_sums[i] + suffix; // The total sum is just accumulating. sum += all_sums[i]; } // And the answer is the total taste of the sandwich minus the worst // interior. printf("%lld\n", sum - interior); } 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 | #include <cstdio> #include "message.h" #include "kanapka.h" typedef long long ll; int main() { // This node will cover the range [beg, end). ll beg = (GetN() * MyNodeId()) / NumberOfNodes(); ll end = (GetN() * (MyNodeId() + 1)) / NumberOfNodes(); // Instead of looking for the tastiest prefix and suffix, we look for the // least tasty interior. ll sum = 0LL; // Sum of all elements in the range ll prefix = 0LL; // The least tasty prefix of the range ll interior = 0LL; // The least tasty interior within the range ll suffix = 0LL; // The least tasty suffix of the range. for (ll i = beg; i < end; ++i) { sum += GetTaste(i); suffix += GetTaste(i); if (suffix > 0LL) suffix = 0LL; interior = (suffix < interior) ? suffix : interior; prefix = (sum < prefix) ? sum : prefix; } // Send the four numbers to the master node. PutLL(0, sum); PutLL(0, prefix); PutLL(0, interior); PutLL(0, suffix); Send(0); if (MyNodeId() == 0) { // Gather all the information from all the nodes. ll all_sums[100]; ll all_prefixes[100]; ll all_interiors[100]; ll all_suffixes[100]; for (int i = 0; i < NumberOfNodes(); ++i) { int node = Receive(-1); all_sums[node] = GetLL(node); all_prefixes[node] = GetLL(node); all_interiors[node] = GetLL(node); all_suffixes[node] = GetLL(node); } // Now we do almost the same calculation to find the best overall interior. sum = interior = suffix = 0LL; for (int i = 0; i < NumberOfNodes(); ++i) { // The interior of the i-th node is a candidate for the worst interior. interior = (interior < all_interiors[i]) ? interior : all_interiors[i]; // Also, something from the previous nodes, plus a prefix of this node. interior = (interior < suffix + all_prefixes[i]) ? interior : suffix + all_prefixes[i]; // The suffix is either just contained in this node, or it's all of this // node and a suffix of the rest. suffix = (all_suffixes[i] < all_sums[i] + suffix) ? all_suffixes[i] : all_sums[i] + suffix; // The total sum is just accumulating. sum += all_sums[i]; } // And the answer is the total taste of the sandwich minus the worst // interior. printf("%lld\n", sum - interior); } return 0; } |