BZOJ2241&&P2484 [SDOI2011]打地鼠

大模拟!

枚举锤子的大小,并且一个必要条件是锤子的面积必须是地鼠总数的约数,不然肯定打不完

代码

//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;
}

猜你喜欢

转载自blog.csdn.net/ACerAndAKer/article/details/81487814