#include <bits/stdc++.h>
using namespace std;
long long n, m, k;
vector<vector<long long>> a;
long long solve () {
vector<pair<vector<long long>, long long>> rosn;
vector<long long> malej;
for (long long i = 0; i < n; i++) {
if (m > 1 && a[i][0] < a[i][m-1]) {
long long sum = 0;
for (long long j = 0; j < m; j++)
sum += a[i][j];
rosn.push_back(make_pair(a[i], sum));
}
else {
for (long long j = 0; j < m; j++)
malej.push_back(a[i][j]);
}
}
sort(malej.begin(), malej.end(), greater<long long>());
vector<long long> pref_malej;
if (!malej.empty()) {
pref_malej.resize(malej.size());
pref_malej[0] = malej[0];
for (long long i = 1; i < (long long)malej.size(); i++)
pref_malej[i] = pref_malej[i - 1] + malej[i];
}
sort(rosn.begin(), rosn.end(), [](const auto& a, const auto& b) {
return a.second > b.second;
});
long long Max = 0;
for (long long i = 0; i <= k; i++) {
long long counter = 0, score = 0;
long long last = -1;
for (long long t = 0; t < (long long)rosn.size() && counter + m <= i; t++) {
score += rosn[t].second;
counter += m;
last = t;
}
long long M = 0;
for (long long j = last + 1; j < (long long)rosn.size(); j++) {
long long s = 0;
for (long long t = 0; t < i - counter && t < m; t++) {
s += rosn[j].first[t];
}
M = max(M, s);
}
score += M;
long long ile_wziac_malej = k - i;
if (ile_wziac_malej == 0) {
Max = max(Max, score);
} else if (ile_wziac_malej > 0 && ile_wziac_malej <= (long long)pref_malej.size()) {
score += pref_malej[ile_wziac_malej - 1];
Max = max(Max, score);
}
}
return Max;
}
void wczytaj () {
if (!(cin >> n >> m >> k)) return;
a.clear();
for (long long i = 0; i < n; i++) {
vector<long long> dummy(m);
for (long long t = 0; t < m; t++) {
cin >> dummy[t];
}
a.push_back(dummy);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
wczytaj();
if (!a.empty()) cout << solve() << 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 | #include <bits/stdc++.h> using namespace std; long long n, m, k; vector<vector<long long>> a; long long solve () { vector<pair<vector<long long>, long long>> rosn; vector<long long> malej; for (long long i = 0; i < n; i++) { if (m > 1 && a[i][0] < a[i][m-1]) { long long sum = 0; for (long long j = 0; j < m; j++) sum += a[i][j]; rosn.push_back(make_pair(a[i], sum)); } else { for (long long j = 0; j < m; j++) malej.push_back(a[i][j]); } } sort(malej.begin(), malej.end(), greater<long long>()); vector<long long> pref_malej; if (!malej.empty()) { pref_malej.resize(malej.size()); pref_malej[0] = malej[0]; for (long long i = 1; i < (long long)malej.size(); i++) pref_malej[i] = pref_malej[i - 1] + malej[i]; } sort(rosn.begin(), rosn.end(), [](const auto& a, const auto& b) { return a.second > b.second; }); long long Max = 0; for (long long i = 0; i <= k; i++) { long long counter = 0, score = 0; long long last = -1; for (long long t = 0; t < (long long)rosn.size() && counter + m <= i; t++) { score += rosn[t].second; counter += m; last = t; } long long M = 0; for (long long j = last + 1; j < (long long)rosn.size(); j++) { long long s = 0; for (long long t = 0; t < i - counter && t < m; t++) { s += rosn[j].first[t]; } M = max(M, s); } score += M; long long ile_wziac_malej = k - i; if (ile_wziac_malej == 0) { Max = max(Max, score); } else if (ile_wziac_malej > 0 && ile_wziac_malej <= (long long)pref_malej.size()) { score += pref_malej[ile_wziac_malej - 1]; Max = max(Max, score); } } return Max; } void wczytaj () { if (!(cin >> n >> m >> k)) return; a.clear(); for (long long i = 0; i < n; i++) { vector<long long> dummy(m); for (long long t = 0; t < m; t++) { cin >> dummy[t]; } a.push_back(dummy); } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); wczytaj(); if (!a.empty()) cout << solve() << endl; return 0; } |
English