#include "kanapka.h"
#include "message.h"
#include <iostream>
using namespace std;
const int MAXNODES = 100;
long long min_suffix_tab[MAXNODES];
long long min_prefix_tab[MAXNODES];
long long all_sum_tab[MAXNODES];
long long min_inside_tab[MAXNODES];
long long tab[MAXNODES];
long long min_ll(long long a, long long b) {
if (a < b) return a;
return b;
}
int min_int(int a, int b) {
if (a < b) return a;
return b;
}
long long min_suffix;
long long min_prefix;
long long all_sum;
long long min_inside;
void solve_for_node(long long start, long long end){
min_suffix = 0LL;
min_prefix = 0LL;
all_sum = 0LL;
min_inside = 0LL;
for (long long i = start; i < end; i++) {
long long taste = GetTaste(i);
all_sum += taste;
min_suffix = min_ll(min_suffix + taste, 0);
min_inside = min_ll(min_inside, min_suffix);
}
for (long long i = end - 1 ; i >= start; i--) {
long long taste = GetTaste(i);
min_prefix = min_ll(min_prefix + taste,0);
}
}
long long solve_for_all(int number_of_nodes) {
tab[0] = all_sum_tab[0];
for (int i = 1; i < number_of_nodes ;i++) {
tab[i] = tab[i-1] + all_sum_tab[i];
// cout << tab[i] << ' ';
}
long long m = 0LL;
for (int i = 0; i < number_of_nodes ; i++) {
m = min_ll(m, min_inside_tab[i]);
}
for (int i = 0; i < number_of_nodes; i++) {
for(int j = 0; j < number_of_nodes; j++) {
if (i < j) {
// cout << "i:" << i << " " << "j:" << j ;
long long sp = min_suffix_tab[i] + min_prefix_tab[j];
if (i < j -1) {
sp += tab[j-1] - tab[i];
// cout << "j" ;
}
m = min_ll(m, sp);
// cout<< endl;
}
}
}
// cout << m << endl;
return tab[number_of_nodes - 1] - m;
}
void send_message(){
PutLL(0, min_suffix);
PutLL(0, min_prefix);
PutLL(0, all_sum);
PutLL(0, min_inside);
Send(0);
}
int main() {
long long start, end;
int number_of_nodes = min_int(NumberOfNodes(),GetN());
// number_of_nodes = 2;
int node_id = MyNodeId();
long long n = GetN();
start = node_id * n /number_of_nodes;
end = (node_id + 1) * n / number_of_nodes ;
if (node_id == number_of_nodes - 1) end = n;
if (node_id < number_of_nodes) {
// cout << start << " " << end << endl;
solve_for_node(start, end);
send_message();
}
if (node_id == 0) {
for(int i = 0; i < number_of_nodes ; i++) {
Receive(i);
min_suffix_tab[i] = GetLL(i);
min_prefix_tab[i] = GetLL(i);
all_sum_tab[i] = GetLL(i);
min_inside_tab[i] = GetLL(i);
// cout << i << " " << min_suffix_tab[i] << " " << min_prefix_tab[i] << " " << all_sum_tab[i] << " " << min_inside_tab[i] << endl;
}
cout << solve_for_all(number_of_nodes);
}
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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #include "kanapka.h" #include "message.h" #include <iostream> using namespace std; const int MAXNODES = 100; long long min_suffix_tab[MAXNODES]; long long min_prefix_tab[MAXNODES]; long long all_sum_tab[MAXNODES]; long long min_inside_tab[MAXNODES]; long long tab[MAXNODES]; long long min_ll(long long a, long long b) { if (a < b) return a; return b; } int min_int(int a, int b) { if (a < b) return a; return b; } long long min_suffix; long long min_prefix; long long all_sum; long long min_inside; void solve_for_node(long long start, long long end){ min_suffix = 0LL; min_prefix = 0LL; all_sum = 0LL; min_inside = 0LL; for (long long i = start; i < end; i++) { long long taste = GetTaste(i); all_sum += taste; min_suffix = min_ll(min_suffix + taste, 0); min_inside = min_ll(min_inside, min_suffix); } for (long long i = end - 1 ; i >= start; i--) { long long taste = GetTaste(i); min_prefix = min_ll(min_prefix + taste,0); } } long long solve_for_all(int number_of_nodes) { tab[0] = all_sum_tab[0]; for (int i = 1; i < number_of_nodes ;i++) { tab[i] = tab[i-1] + all_sum_tab[i]; // cout << tab[i] << ' '; } long long m = 0LL; for (int i = 0; i < number_of_nodes ; i++) { m = min_ll(m, min_inside_tab[i]); } for (int i = 0; i < number_of_nodes; i++) { for(int j = 0; j < number_of_nodes; j++) { if (i < j) { // cout << "i:" << i << " " << "j:" << j ; long long sp = min_suffix_tab[i] + min_prefix_tab[j]; if (i < j -1) { sp += tab[j-1] - tab[i]; // cout << "j" ; } m = min_ll(m, sp); // cout<< endl; } } } // cout << m << endl; return tab[number_of_nodes - 1] - m; } void send_message(){ PutLL(0, min_suffix); PutLL(0, min_prefix); PutLL(0, all_sum); PutLL(0, min_inside); Send(0); } int main() { long long start, end; int number_of_nodes = min_int(NumberOfNodes(),GetN()); // number_of_nodes = 2; int node_id = MyNodeId(); long long n = GetN(); start = node_id * n /number_of_nodes; end = (node_id + 1) * n / number_of_nodes ; if (node_id == number_of_nodes - 1) end = n; if (node_id < number_of_nodes) { // cout << start << " " << end << endl; solve_for_node(start, end); send_message(); } if (node_id == 0) { for(int i = 0; i < number_of_nodes ; i++) { Receive(i); min_suffix_tab[i] = GetLL(i); min_prefix_tab[i] = GetLL(i); all_sum_tab[i] = GetLL(i); min_inside_tab[i] = GetLL(i); // cout << i << " " << min_suffix_tab[i] << " " << min_prefix_tab[i] << " " << all_sum_tab[i] << " " << min_inside_tab[i] << endl; } cout << solve_for_all(number_of_nodes); } return 0; } |
English