戳我穿越: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 }

 

posted on 2015-07-28 15:16  蜘蛛侦探  阅读(471)  评论(0编辑  收藏  举报