戳我穿越:
对于贪心,二分,枚举等基础一定要掌握的很牢,要一步一个脚印走踏实
这是道贪心的题目,要有贪心的意识。
首先将所有为0的地方统计,因为是求最小的字数,所有最后一行后面的0可以看为空格直接减掉,
因为有m段(一定包括第一行),再减去m*2,最后枚举每行,将至少前两个为0的上一行的最后有多少
的0统计起来排序,再依次减去前m-1个大的,这样就保证了得到的答案是符合条件中最小的
code
1 #include2 #include 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 else40 break;41 }42 }43 if (flag)44 lsy[k++]=ans;45 }46 sum-=2*x;x--;47 /*for (i=1;i