注解
1、先统计所有0的个数。第一行一定是段首,最后一行一定是段尾。把第一行开头和最后一行结尾的0去除。然后把中间可能成为段首的部分,记录上一段最后一行末尾的0的个数。
2、把这些可能的个数降序排列,挑选出最大的M-1个数就可以了。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main() {
int N, L, M;
while(scanf("%d %d %d", &N, &L, &M)!=-1) {
int a[N][L];
memset(a, 0, sizeof(a));
int sum = 0;
for(int i=0; i<N; i++) {
for(int j=0; j<L; j++) {
scanf("%d", &a[i][j]);
if(!a[i][j]) {
sum++;
}
}
}
sum -= M*2;
for(int i=L-1; i>=0; i--) {
if(!a[N-1][i]) {
sum--;
} else {
break;
}
}
int f[N];
memset(f, 0, sizeof(f));
for(int i=1; i<N-1; i++) {
if(!a[i][0] && !a[i][1]) {
for(int j=L-1; j>=0; j--) {
if(!a[i-1][j]) {
f[i-1]++;
}
else{
break;
}
}
}
}
sort(f, f+N);
for(int i=0; i<M-1; i++){
sum -= f[N-1-i];
}
cout<<sum<<endl;
}
return 0;
}