#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <cmath>
#include <string>
#include <queue>
#include <numeric>
using namespace std;
using ll = long long;
int main() {
int n, m, k;
cin >> n >> m >> k;
vector<vector<ll>> T;
vector<ll> B, Tbase;
for (int i = 0; i < n; i++) {
vector<ll> v(m);
for (auto &i : v) {
cin >> i;
}
if (v[0] >= v.back()) {
for (auto i : v) {
B.push_back(i);
}
} else {
v.insert(v.begin(), 0);
for (int j = 1; j <= m; j++) {
v[j] += v[j-1];
}
Tbase.push_back(v.back());
T.push_back(std::move(v));
}
}
ranges::sort(B, greater<>());
if (B.size() > k) {
B.resize(k);
}
vector<ll> Bsum(B.size()+1);
for (int i = 0; i < B.size(); i++) {
Bsum[i+1] = B[i] + Bsum[i];
}
ll res = Bsum[min((int)B.size(), k)];
for (int i = 0; i <= min(m-1, (int)B.size()); i++) {
ll cur = Bsum[i];
int t = (k - i + m) % m;
int cnt = (k - i - t) / m;
vector<ll> cand = Tbase;
for(int j = i; j + m <= B.size(); j += m) {
cand.push_back(Bsum[j+m] - Bsum[j]);
}
ranges::sort(cand, greater<>());
for (int j = 0; j < cnt; j++) {
cur += cand[j];
}
for (int j = 0; j < T.size(); j++) {
ll curres = cur + T[j][t];
if (t && cnt && T[j][m] >= cand[cnt-1]) {
curres -= T[j][m];
if (cnt < cand.size()) {
curres += cand[cnt];
}
}
res = max(res, curres);
}
}
cout << res << 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 | #include <iostream> #include <vector> #include <algorithm> #include <map> #include <set> #include <cmath> #include <string> #include <queue> #include <numeric> using namespace std; using ll = long long; int main() { int n, m, k; cin >> n >> m >> k; vector<vector<ll>> T; vector<ll> B, Tbase; for (int i = 0; i < n; i++) { vector<ll> v(m); for (auto &i : v) { cin >> i; } if (v[0] >= v.back()) { for (auto i : v) { B.push_back(i); } } else { v.insert(v.begin(), 0); for (int j = 1; j <= m; j++) { v[j] += v[j-1]; } Tbase.push_back(v.back()); T.push_back(std::move(v)); } } ranges::sort(B, greater<>()); if (B.size() > k) { B.resize(k); } vector<ll> Bsum(B.size()+1); for (int i = 0; i < B.size(); i++) { Bsum[i+1] = B[i] + Bsum[i]; } ll res = Bsum[min((int)B.size(), k)]; for (int i = 0; i <= min(m-1, (int)B.size()); i++) { ll cur = Bsum[i]; int t = (k - i + m) % m; int cnt = (k - i - t) / m; vector<ll> cand = Tbase; for(int j = i; j + m <= B.size(); j += m) { cand.push_back(Bsum[j+m] - Bsum[j]); } ranges::sort(cand, greater<>()); for (int j = 0; j < cnt; j++) { cur += cand[j]; } for (int j = 0; j < T.size(); j++) { ll curres = cur + T[j][t]; if (t && cnt && T[j][m] >= cand[cnt-1]) { curres -= T[j][m]; if (cnt < cand.size()) { curres += cand[cnt]; } } res = max(res, curres); } } cout << res << endl; return 0; } |
English