X-man

导航

hdu 1735(字数统计)

View Code
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[10001][101];//纸数组
typedef struct Node
{
    int ik,ii;
}mi;//最后一排有的连续空格
bool cmp(Node a,Node b)
{
    if(a.ik>b.ik)
    return true;
    return false;
}
int main()
{
    int N,L,M;
    int i,j;
    int res,k,ki,ans;
    while(scanf("%d %d %d",&N,&L,&M)!=EOF)
    {
        mi m[10001];
        memset(a,0,sizeof(a));
        memset(m,0,sizeof(m));
        res=0;
        ans=0;
        for(i=0;i<N;i++)
        for(j=0;j<L;j++)
        {
            scanf("%d",&a[i][j]);
            if(a[i][j]==0)ans++;
        }
        ki=0;
        for(i=0;i<N;i++)
        {
            k=0;
            for(j=L-1;j>-1;j--)
            if(a[i][j]!=0)break;
            else k++;
            if(k!=0)m[ki].ii=i,m[ki++].ik=k;//记录行i,和尾部0的个数
        }
        sort(m,m+ki,cmp);
        //for(i=0;i<ki;i++)
        //printf("%d %d\n",m[i].ii,m[i].ik);
        int ri;
        for(j=0,ri=0;j<ki,ri<=M;j++)
            if(a[m[j].ii+1][0]==0&&a[m[j].ii+1][1]==0)ri++,res-=m[j].ik;
            else continue;//填补最多的尾0  (+2)
        printf("%d\n",ans+res-M*2);

    }
    return 0;
}

1.该代码的主要思路是:根据可能的最大行尾找能否对应行首;

//memset(m,0,sizeof(m));

以上是未解决的内存问题!

 2.@@换用行首找最大的前行尾(此思路相比更清晰)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[10001][101];
struct Node
{
    int ii,ik;
}m[10001];
bool cmp(Node a,Node b)
{
    if(a.ik>b.ik)
    return true;
    return false;
}
int main()
{
    int M,L,N;
    int i,j,k;
    int ans;
    while(scanf("%d%d%d",&N,&L,&M)!=EOF)
    {
        ans=0;
        memset(a,0,sizeof(a));
        memset(m,0,sizeof(m));
        for(i=0;i<N;i++)
        for(j=0;j<L;j++)
        {
            scanf("%d",&a[i][j]);
            if(a[i][j]==0)ans++;//找出所有0
        }
        for(i=L-1;i>-1;i--)
        if(a[N-1][i]==0)ans--;//减去最后段的尾部0
        else break;
        k=0;
        for(i=1;i<N;i++)//首行肯定为首段,判断从第二个段开始i=1
        if(a[i][0]==0&&a[i][1]==0)
        {
            int t=0;
            m[k].ii=i;//记录可能的段首
            for(j=L-1;j>-1;j--)
            if(a[i-1][j]==0)t++,m[k].ik=t;//记录对应的段首的前段尾
            else break;
            k++;
        }
        sort(m,m+k,cmp);
        for(j=0;j<M-1;j++)//减M-1个段的最大的前段尾
        ans-=m[j].ik;
        printf("%d\n",ans-M*2);//减去段首的前两空格
    }
    return 0;
}
对于代码中:        
memset(a,
0,sizeof(a)); memset(m,0,sizeof(m));
每组数据都是覆盖的输入(每次用的循环变量都固定大小),应该不初始化也可以才对?????????
事实是不初始化过不了!

posted on 2013-04-19 12:29  雨钝风轻  阅读(312)  评论(0编辑  收藏  举报