大模拟!
枚举锤子的大小,并且一个必要条件是锤子的面积必须是地鼠总数的约数,不然肯定打不完
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,sum;
int map[150][150];
int ans=1e9+7;
void slove(int x,int y)
{
int tmp[150][150];
for (int i=1;i<=n;i++)
for (int k=1;k<=m;k++)
tmp[i][k]=map[i][k];
for (int i=1;i<=n;i++)
for (int k=1;k<=m;k++)
if (tmp[i][k])
{
if (i+x>n+1||k+y>m+1) return ;
int emm=tmp[i][k];
for (int e=0;e<x;e++)
for (int j=0;j<y;j++)
{
tmp[i+e][k+j]-=emm;
if (tmp[i+e][k+j]<0) return ;
}
}
ans=sum/(x*y);
return ;
}
signed main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int k=1;k<=m;k++)
scanf("%d",&map[i][k]),sum+=map[i][k];
for (int i=n;i>0;i--)
for (int k=m;k>0;k--)
if (sum%(i*k)==0&&sum/(i*k)<ans) slove(i,k);
cout<<ans;
return 0;
}