题目传送门
前言:不是这样例有点过分了哈:
这是我没考虑到无解的情况的得分:
这是我考虑了的得分:
总而言之,就是一个Subtask 你没考虑无解的情况(除了Subtask #0),就会WA一大片,然后这个Subtask 就不得分了(感觉有点亏),废话不多说,进入题解。
题解:
分析:
- 输入的时候是不带空格的,所以要用字符串输入
- 要知道是符合黑色格的个数是否大于等于k,就得用到二维前缀和
- 该题需要求解的内容需要通过公式计算,然后再比大小才行
- 考虑误解情况,即没有符合黑色格大于k的情
思路:
- 首先我们知道该题是没有用空格输入的,所以对于这道题来说,我们要先用字符形式暂存,然后在转化为整数形式
scanf(" %c",&c);//输入字符 a[i][j]=c-'0'; //将字符转化为整数
- 对于这道题来说,我们要用到二位前缀和,因为该题的输入可以采用求子矩阵的和来判断是否满足条件(1表示黑色格,0表示白色格),而我们要知道二维前缀和的公式,即
,而他的调用公式则为
- 该提示需要求矩阵的大小,所以我们要知道如何求他的公式,该公式为
- 我们要考虑无解情况,即没有满足条件,那么我们直接输出0即可
AC CODE(全部):
#include<bits/stdc++.h>
using namespace std;int n,m,k;
int a[105][105];//该数组用来存储和输入
int s[105][105];//该数组用来计算前缀和
char c;//辅助输入(因为输入中没有空格需要用字符来先代替)
int minn=2147483647; int main(){scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf(" %c",&c);//输入字符 a[i][j]=c-'0'; //将字符转化为整数 s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];//计算前缀和 }}for(int x1=1;x1<=n;x1++){for(int j1=1;j1<=m;j1++){for(int x2=x1;x2<=n;x2++){ for(int j2=j1;j2<=m;j2++){//因为x2>=x1并且j2>=j1,所以x2和j2分别从x1和j1开始枚举即可 if(s[x2][j2]-s[x2][j1-1]-s[x1-1][j2]+s[x1-1][j1-1]>=k){// s[x2][j2]-s[x2][j1-1]-s[x1-1][j2]+s[x1-1][j1-1]用来调用前缀和 int s=(x2-x1+1)*(j2-j1+1);//计算该矩形大小 minn=min(minn,s);}}}}}if(minn==2147483647){//特殊情况(无解) printf("0");return 0;}printf("%d",minn);return 0;
}