#include <iostream> #include <vector> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n; unsigned long long int m; long long int a; int cnt = 0; cin >> n >> m; vector<long long int> scores(n); for (int i = 0; i < n; i++) { cin >> a; scores[i] = a; } int max_idx; vector<long long int> max_vals(n); for (unsigned long long b = 1; b <= m; ++b) { int binary_ones = 0; unsigned long long other_b = b; while (other_b != 0) { other_b = other_b & (other_b - 1); binary_ones++; } if (b < n) { max_idx = (int) b; } else { max_idx = n - 1; } for (; max_idx > 0; --max_idx) { long long int curr = binary_ones * scores[max_idx]; if (b > max_idx) { max_vals[max_idx] = max((max_vals[max_idx - 1] + curr), max_vals[max_idx]); } else { max_vals[max_idx] = max_vals[max_idx - 1] + curr; } } max_vals[0] = max(max_vals[0], scores[0] * binary_ones); } cout << max_vals[n - 1] << '\n'; 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 | #include <iostream> #include <vector> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n; unsigned long long int m; long long int a; int cnt = 0; cin >> n >> m; vector<long long int> scores(n); for (int i = 0; i < n; i++) { cin >> a; scores[i] = a; } int max_idx; vector<long long int> max_vals(n); for (unsigned long long b = 1; b <= m; ++b) { int binary_ones = 0; unsigned long long other_b = b; while (other_b != 0) { other_b = other_b & (other_b - 1); binary_ones++; } if (b < n) { max_idx = (int) b; } else { max_idx = n - 1; } for (; max_idx > 0; --max_idx) { long long int curr = binary_ones * scores[max_idx]; if (b > max_idx) { max_vals[max_idx] = max((max_vals[max_idx - 1] + curr), max_vals[max_idx]); } else { max_vals[max_idx] = max_vals[max_idx - 1] + curr; } } max_vals[0] = max(max_vals[0], scores[0] * binary_ones); } cout << max_vals[n - 1] << '\n'; return 0; } |