hdu 1735 字数统计

这道题是到贪心的题目,首先用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;
}
View Code
原文地址:https://www.cnblogs.com/acm-jing/p/4333404.html