#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m;
long long k;
if (!(cin >> n >> m >> k)) return 0;
vector<long long> all_pancakes;
all_pancakes.reserve(n * m);
for (int i = 0; i < n; ++i) {
vector<long long> stack(m);
for (int j = 0; j < m; ++j) {
cin >> stack[j];
}
bool non_increasing = true;
bool non_decreasing = true;
for (int j = 0; j < m - 1; ++j) {
if (stack[j] < stack[j + 1]) non_increasing = false;
if (stack[j] > stack[j + 1]) non_decreasing = false;
}
if (non_increasing) {
for (long long val : stack) {
all_pancakes.push_back(val);
}
} else {
long long current_sum = 0;
for (int j = 0; j < m; ++j) {
current_sum += stack[j];
all_pancakes.push_back(current_sum);
if (j > 0) {
all_pancakes.back() -= (all_pancakes[all_pancakes.size() - 2]);
}
}
int start_idx = all_pancakes.size() - m;
sort(all_pancakes.begin() + start_idx, all_pancakes.end(), greater<long long>());
vector<long long> best_prefix(m);
long long running = 0;
for(int j = 0; j < m; ++j) {
running += stack[j];
best_prefix[j] = running;
}
for(int j = 0; j < m; ++j) {
all_pancakes[start_idx + j] = stack[j];
}
}
}
vector<long long> candidates;
for (int i = 0; i < n; ++i) {
int start = i * m;
long long current_prefix_sum = 0;
for (int j = 0; j < m; ++j) {
current_prefix_sum += all_pancakes[start + j];
candidates.push_back(current_prefix_sum);
}
}
sort(candidates.begin(), candidates.end(), greater<long long>());
long long total_sum = 0;
vector<int> used_from_stack(n, 0);
vector<pair<long long, int>> flat;
for(int i=0; i<n; ++i) {
long long s = 0;
for(int j=0; j<m; ++j) {
s += all_pancakes[i*m + j];
flat.push_back({all_pancakes[i*m + j], i});
}
}
vector<long long> results;
for(int i=0; i<n; ++i) {
long long current = 0;
for(int j=0; j<m; ++j) {
current += all_pancakes[i*m + j];
results.push_back(current);
}
}
sort(results.begin(), results.end(), greater<long long>());
vector<long long> p_sums[n];
vector<pair<long long, pair<int, int>>> options;
for(int i=0; i<n; ++i) {
long long cur = 0;
for(int j=0; j<m; ++j) {
cur += all_pancakes[i*m + j];
options.push_back({all_pancakes[i*m + j], {i, j}});
}
}
vector<long long> vals;
for(int i=0; i<n; i++) {
long long sum = 0;
for(int j=0; j<m; j++) {
sum += all_pancakes[i*m + j];
vals.push_back(sum);
}
}
sort(vals.begin(), vals.end(), greater<long long>());
long long ans = 0;
vector<int> ptr(n, 0);
for(int i=0; i<k; ++i) {
int best_stack = -1;
long long max_val = -1;
for(int j=0; j<n; ++j) {
if(ptr[j] < m) {
if(all_pancakes[j*m + ptr[j]] > max_val) {
max_val = all_pancakes[j*m + ptr[j]];
best_stack = j;
}
}
}
if(best_stack != -1) {
ans += max_val;
ptr[best_stack]++;
}
}
cout << ans << 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 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 130 131 132 133 134 135 136 137 138 139 140 | #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m; long long k; if (!(cin >> n >> m >> k)) return 0; vector<long long> all_pancakes; all_pancakes.reserve(n * m); for (int i = 0; i < n; ++i) { vector<long long> stack(m); for (int j = 0; j < m; ++j) { cin >> stack[j]; } bool non_increasing = true; bool non_decreasing = true; for (int j = 0; j < m - 1; ++j) { if (stack[j] < stack[j + 1]) non_increasing = false; if (stack[j] > stack[j + 1]) non_decreasing = false; } if (non_increasing) { for (long long val : stack) { all_pancakes.push_back(val); } } else { long long current_sum = 0; for (int j = 0; j < m; ++j) { current_sum += stack[j]; all_pancakes.push_back(current_sum); if (j > 0) { all_pancakes.back() -= (all_pancakes[all_pancakes.size() - 2]); } } int start_idx = all_pancakes.size() - m; sort(all_pancakes.begin() + start_idx, all_pancakes.end(), greater<long long>()); vector<long long> best_prefix(m); long long running = 0; for(int j = 0; j < m; ++j) { running += stack[j]; best_prefix[j] = running; } for(int j = 0; j < m; ++j) { all_pancakes[start_idx + j] = stack[j]; } } } vector<long long> candidates; for (int i = 0; i < n; ++i) { int start = i * m; long long current_prefix_sum = 0; for (int j = 0; j < m; ++j) { current_prefix_sum += all_pancakes[start + j]; candidates.push_back(current_prefix_sum); } } sort(candidates.begin(), candidates.end(), greater<long long>()); long long total_sum = 0; vector<int> used_from_stack(n, 0); vector<pair<long long, int>> flat; for(int i=0; i<n; ++i) { long long s = 0; for(int j=0; j<m; ++j) { s += all_pancakes[i*m + j]; flat.push_back({all_pancakes[i*m + j], i}); } } vector<long long> results; for(int i=0; i<n; ++i) { long long current = 0; for(int j=0; j<m; ++j) { current += all_pancakes[i*m + j]; results.push_back(current); } } sort(results.begin(), results.end(), greater<long long>()); vector<long long> p_sums[n]; vector<pair<long long, pair<int, int>>> options; for(int i=0; i<n; ++i) { long long cur = 0; for(int j=0; j<m; ++j) { cur += all_pancakes[i*m + j]; options.push_back({all_pancakes[i*m + j], {i, j}}); } } vector<long long> vals; for(int i=0; i<n; i++) { long long sum = 0; for(int j=0; j<m; j++) { sum += all_pancakes[i*m + j]; vals.push_back(sum); } } sort(vals.begin(), vals.end(), greater<long long>()); long long ans = 0; vector<int> ptr(n, 0); for(int i=0; i<k; ++i) { int best_stack = -1; long long max_val = -1; for(int j=0; j<n; ++j) { if(ptr[j] < m) { if(all_pancakes[j*m + ptr[j]] > max_val) { max_val = all_pancakes[j*m + ptr[j]]; best_stack = j; } } } if(best_stack != -1) { ans += max_val; ptr[best_stack]++; } } cout << ans << endl; return 0; } |
English