• 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));
    每组数据都是覆盖的输入(每次用的循环变量都固定大小),应该不初始化也可以才对?????????
    事实是不初始化过不了!
  • 相关阅读:
    java环境变量配置
    经纬度与度分秒转换
    Linux下屏幕截图
    mCustomScrollbar动态加载滚动条
    解决PHPExcel列超过26的问题
    解决PHPExcel长数字串显示为科学计数
    URL获取并修改参数【转】
    Windows下启动nginx,关闭nginx
    Linux 查看目录的相关权限
    Python文件装换成C文件,主要用于隐藏核心文件实现步骤
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3030418.html
Copyright © 2020-2023  润新知