#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
void print_vv(vector<vector<long long>> v){
for(auto &r: v){
for(auto &e: r){
fprintf(stderr, "%lld ", e);
}
fprintf(stderr, "\n");
}
fprintf(stderr, "==============\n");
}
void print_v(vector<long long> v){
for(auto &e: v){
fprintf(stderr, "%lld ", e);
}
fprintf(stderr, "\n");
fprintf(stderr, "==============\n");
}
int main() {
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
long long total = 0;
vector<vector<long long>> rosnace;
vector<long long> malejace;
for(int i = 0; i < n; i++) {
vector<long long> t(m);
for(int j = 0; j < m; j++) {
scanf("%lld", &t[j]);
// total += t[j];
}
// malejące
if(t[0] >= t[m-1]) {
malejace.insert(malejace.end(), t.begin(), t.end());
}
else {
for(int ii = 1; ii < m; ii++) {
t[ii] += t[ii-1];
}
rosnace.push_back(t);
}
}
// print_v(malejace);
sort(malejace.begin(), malejace.end(), greater<long long>());
print_v(malejace);
// print_vv(rosnace);
sort(rosnace.begin(), rosnace.end(), [&m](const vector<long long> &a, const vector<long long> &b) {
return a[m-1] > b[m-1];
});
// print_vv(rosnace);
int c = 0;
int ro = 0;
int ma = 0;
long long sum_ma = 0;
if(ma*m < malejace.size()) {
for(int i = 0; i < m; i++) {
sum_ma += malejace[ma*m+i];
}
}
while(c < k/m) {
if(ro < rosnace.size() && rosnace[ro][m-1] >= sum_ma) {
total += rosnace[ro][m-1];
ro++;
}
else {
total += sum_ma;
ma++;
sum_ma = 0;
if(ma*m < malejace.size()) {
for(int i = 0; i < m; i++) {
sum_ma += malejace[ma*m+i];
}
}
}
c++;
}
int pos = k%m;
if(pos>0) {
if(ro < rosnace.size()) {
sort(rosnace.begin()+ro, rosnace.end(), [&pos](const vector<long long> &a, const vector<long long> &b) {
return a[pos-1] > b[pos-1];
});
}
// print_vv(rosnace);
sum_ma = 0;
if(ma*m < malejace.size()) {
for(int i = 0; i < pos; i++) {
sum_ma += malejace[ma*m+i];
}
}
if(ro < rosnace.size() && rosnace[ro][pos-1] >= sum_ma) {
total += rosnace[ro][pos-1];
}
else {
total += sum_ma;
}
}
printf("%lld\n", total);
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 | #include <algorithm> #include <iostream> #include <stdio.h> #include <vector> using namespace std; void print_vv(vector<vector<long long>> v){ for(auto &r: v){ for(auto &e: r){ fprintf(stderr, "%lld ", e); } fprintf(stderr, "\n"); } fprintf(stderr, "==============\n"); } void print_v(vector<long long> v){ for(auto &e: v){ fprintf(stderr, "%lld ", e); } fprintf(stderr, "\n"); fprintf(stderr, "==============\n"); } int main() { int n, m, k; scanf("%d %d %d", &n, &m, &k); long long total = 0; vector<vector<long long>> rosnace; vector<long long> malejace; for(int i = 0; i < n; i++) { vector<long long> t(m); for(int j = 0; j < m; j++) { scanf("%lld", &t[j]); // total += t[j]; } // malejące if(t[0] >= t[m-1]) { malejace.insert(malejace.end(), t.begin(), t.end()); } else { for(int ii = 1; ii < m; ii++) { t[ii] += t[ii-1]; } rosnace.push_back(t); } } // print_v(malejace); sort(malejace.begin(), malejace.end(), greater<long long>()); print_v(malejace); // print_vv(rosnace); sort(rosnace.begin(), rosnace.end(), [&m](const vector<long long> &a, const vector<long long> &b) { return a[m-1] > b[m-1]; }); // print_vv(rosnace); int c = 0; int ro = 0; int ma = 0; long long sum_ma = 0; if(ma*m < malejace.size()) { for(int i = 0; i < m; i++) { sum_ma += malejace[ma*m+i]; } } while(c < k/m) { if(ro < rosnace.size() && rosnace[ro][m-1] >= sum_ma) { total += rosnace[ro][m-1]; ro++; } else { total += sum_ma; ma++; sum_ma = 0; if(ma*m < malejace.size()) { for(int i = 0; i < m; i++) { sum_ma += malejace[ma*m+i]; } } } c++; } int pos = k%m; if(pos>0) { if(ro < rosnace.size()) { sort(rosnace.begin()+ro, rosnace.end(), [&pos](const vector<long long> &a, const vector<long long> &b) { return a[pos-1] > b[pos-1]; }); } // print_vv(rosnace); sum_ma = 0; if(ma*m < malejace.size()) { for(int i = 0; i < pos; i++) { sum_ma += malejace[ma*m+i]; } } if(ro < rosnace.size() && rosnace[ro][pos-1] >= sum_ma) { total += rosnace[ro][pos-1]; } else { total += sum_ma; } } printf("%lld\n", total); return 0; } |
English