戳我穿越:http://acm.hdu.edu.cn/showproblem.php?pid=1735
对于贪心,二分,枚举等基础一定要掌握的很牢,要一步一个脚印走踏实
这是道贪心的题目,要有贪心的意识。
首先将所有为0的地方统计,因为是求最小的字数,所有最后一行后面的0可以看为空格直接减掉,
因为有m段(一定包括第一行),再减去m*2,最后枚举每行,将至少前两个为0的上一行的最后有多少
的0统计起来排序,再依次减去前m-1个大的,这样就保证了得到的答案是符合条件中最小的
code
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int yj[10001][101],lsy[10001]; 5 bool cmp(int x,int y){return x>y;} 6 int main() 7 { 8 int n,m,x,sum,ans,i,j,k,flag; 9 while (~scanf("%d %d %d",&n,&m,&x)) 10 { 11 sum=0; 12 for (i=1;i<=n;i++) 13 { 14 for (j=1;j<=m;j++) 15 { 16 scanf("%d",&yj[i][j]); 17 if (!yj[i][j]) 18 sum++; 19 } 20 } 21 //printf("%d\n",sum); 22 for (i=m;i>=1;i--) 23 { 24 if (!yj[n][i]) sum--; 25 else break; 26 } 27 //printf("%d\n",sum); 28 k=1; 29 for (i=2;i<=n;i++) 30 { 31 ans=0;flag=0; 32 if (!yj[i][1]&&!yj[i][2]) 33 { 34 flag=1; 35 for (j=m;j>=1;j--) 36 { 37 if (!yj[i-1][j]) 38 ans++; 39 else 40 break; 41 } 42 } 43 if (flag) 44 lsy[k++]=ans; 45 } 46 sum-=2*x;x--; 47 /*for (i=1;i<k;i++) 48 printf("%d ",lsy[i]); 49 printf("\n");*/ 50 sort(lsy+1,lsy+k,cmp); 51 for (i=1;i<=x;i++) 52 sum-=lsy[i]; 53 printf("%d\n",sum); 54 } 55 return 0; 56 }