19
思路:题意中国人应该都知道。那么我们怎么入手呢?对于此类的题目还是做好要建立一个表格来分析,所以我就建立了一个分析表
0 0 0 1 1 1 0 1 1 0
1 1 0 0 0 1 1 1 0 0
0 0 1 1 0 0 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 0 1 0 1 1 1 0 0 0
1 1 0 0 1 1 1 1 1 1
1 1 1 1 1 1 1 0 0 0
0 0 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
0 0 0 0 1 1 1 1 1 0
这就是题目给出的测试结果分析。所以只需先统计好0的个数,然后再统计好对于一行数,如果下行可能为段落开始,且本行都是以0来结尾,将此类行的尾0数统计下来放到一个新的数组b中,再对新的数组进行从大到小排序(贪心思想)。然后减去最后一行的尾0数,再减去前b(m-1)项的和即可
#include <cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[10001][101];
int b[10001];
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int n,m,t,i,k,j,x,d;
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
x=0;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]==0)
x++;
}
memset(b,0,sizeof(b));
k=0;
for(i=1;i<n;i++)
{
if(a[i][0]==0&&a[i][1]==0)
{
for(j=m-1;j>=0;j--)
{
if(a[i-1][j]==0)
b[k]++;
else
break;
}
}
k++;
}
for(i=m-1;i>=0;i--){
if(a[n-1][i]==0)
x--;
else
break;
}
sort(b,b+k,cmp);
for(i=0;i<t-1;i++) //这里我开始的思路是比较K,T的大小。结果W了,后来学长提醒了一下才知道
x-=b[i]; //根本不需要比较,因为绝对会出K>=t的情况,大于了t也只能减去前b(t-1)
printf("%d\n",x-2*t); //项的和
}
return 0;
}