题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1735
这道题是借鉴了网上的某位大神的思路及代码。。
我说一下思路:先用ans来存储为0的个数,然后记录下来可能为段尾的行的0个数(在b[]数组里),题中一共说有m段,那么段首 一共有2 * m个没有被污浊的格子,另外,最后一行一定是个段尾,所以ans -= 2 * m,ans -= num;然后就是贪心的思想,题中说至少,我们就是要减去可能为断尾0的个数最多的。。。如果不懂直接点击下面的链接。。。
来自这位大神的。http://blog.csdn.net/snowy_smile/article/details/49666233
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[105];
int b[10005];
int n,l,m;
int main()
{
while(~scanf("%d%d%d",&n,&l,&m))
{
int ans = 0;
int num = 0;
int ed = 0;
for(int i = 1; i <= n; ++i)
{
for(int j = 1;j <= l;++j){
scanf("%d",&a[j]);
if(a[j] == 0)
ans++;
}
if(!a[1] && !a[2])
b[++ed] = num;
for(int j = l; j >= 1; --j)
{
if(a[j] == 1)
{
num = l - j;
break;
}
}
}
ans -= 2 * m;
ans -= num;
sort(b + 1,b + ed + 1);
for(int i = ed; i >= ed - (m - 2); --i)
ans -= b[i];
printf("%d\n",ans);
}
return 0;
}