这道题是到贪心的题目,首先用ans记录下所有的0的个数,然后尽量去掉更多的0,剩下的0的个数就是最少的字数。首先想到最后一行的0的个数可以减掉,然后就是m行开头的两个0可以减掉。然后思考最多还可以减掉多少个0?当然是考虑每段的结尾处0的个数,因为还有m-1行的结尾可以减,所以就进行排序,减掉最大的m-1个段落结尾0。
#include"iostream" #include"stdio.h" #include"algorithm" #include"string.h" #include"queue" #include"cmath" using namespace std; int a[10005][105]; int n,l,m; int cou[10005];//记录每段末尾零的个数 bool cmp(const int a,const int b) { return a>b; } int main() { while(scanf("%d%d%d",&n,&l,&m)==3) { int i,j,k,ans; ans=0;//记录矩阵中所有0的个数 for(i=0;i<n;i++) for(j=0;j<l;j++) { cin>>a[i][j]; if(!a[i][j]) ans++; } k=0;ans-=2*m; for(i=l-1;i>=0;i--) { if(!a[n-1][i]) ans--; else break; } for(i=1;i<n;i++) { int c=0; if(!a[i][0]&&!a[i][1]) { for(j=l-1;j>=0;j--) { if(!a[i-1][j]) c++; else break; } cou[k++]=c; } } sort(cou,cou+k,cmp); for(i=0;i<m-1;i++) { ans-=cou[i]; } cout<<ans<<endl; } return 0; }