1 条题解
-
0
暴力枚举r和c,然后判断r和c的合法性
但是如果暴力check的话,肯定会超时,所以要进行部分的优化
我们会发现每次都只能消除 的方块,所以我们可以判断当方块总数不能整除 的时候,就直接返回false,然后枚举每个格子中的方块,然后每次将 范围内的方块都减去该格子内的数量,判断是否会越界,或者减去之后小于0的格子,若有则返回false,还要判断一下后面的格子会不会有方块,因为你没有判断越界的部分,最后将最小的保留,即为本题答案。
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int n,m,sum=0; int ma[101][101],co[101][101]; bool check(int x,int y) { if(sum%(x*y)) return 0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { co[i][j]=ma[i][j]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(co[i][j]) { int temp=co[i][j]; for(int k=1;k<=x;k++) { for(int l=1;l<=y;l++) { if(i+k-1>n||j+l-1>m) return 0; co[i+k-1][j+l-1]-=temp; if(co[i+k-1][j+l-1]<0) return 0; } } } } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(co[i][j]) return 0; } } return 1; } int main() { scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&ma[i][j]); sum+=ma[i][j]; } } int ans=0x3f3f3f3f; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(check(i,j)) { ans=min(ans,(sum)/(i*j)); } } } printf("%d",ans); }
- 1
信息
- ID
- 843
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 11
- 已通过
- 1
- 上传者