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));
每组数据都是覆盖的输入(每次用的循环变量都固定大小),应该不初始化也可以才对?????????
事实是不初始化过不了!