HDu 1735ワード統計


タイトルリンク: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
",ans); } return 0; }