水题
数据量不大,直接 用 sum [ i ] [ j ] 表示 第 i 列 前 j 个元素的和;
然后 每一列,枚举 第 j 个元素,找出 ( j ) ~ ( j+k-1 )区间和最大值,这时 前 i - 1 个元素的和就是要改变的值
再骂一发,,昨晚的 B 好傻逼,,以前做过类似的题的,,明明扫一遍就好,,几把还很自信的用 二分写!! shabi~~
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 100 + 7, INF = 0x7f7f7f7f;
int n, m, k;
int a[maxn][maxn];
int sum[maxn][maxn] = {0};
void init() {
scanf("%d %d %d", &n, &m, &k);
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= m; ++j) {
scanf("%d", &a[i][j]);
sum[j][i] = sum[j][i-1] + a[i][j];
}
}
}
void solve() {
int ans = 0, ids = 0;
for(int i = 1; i <= m; ++i) { // m 列 每列找最大
int max_ = -INF, id = 0;
int j;
for(j = 1;; ++j) {
int t = j+k-1;
if(t > n) break;
if(sum[i][t] - sum[i][j-1] > max_) {
id = sum[i][j-1];
max_ = sum[i][t] - sum[i][j-1];
}
}
ans += max_; ids += id;
}
cout << ans << " " << ids << endl;
}
int main() {
init();
solve();
return 0;
}
/*
4 3 2
0 1 0
1 0 1
0 1 0
1 1 1
*/