记录编号 23694 评测结果 AAAAAAAAAA
题目名称 Brownie Slicing 最终得分 100
用户昵称 GravatarPom 是否通过 通过
代码语言 C++ 运行时间 0.447 s
提交时间 2011-03-17 15:21:41 内存使用 1.22 MiB
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

const int MAXN=503;

int n,m,A,B,i,j,k,l,r,ans;
int sum[MAXN][MAXN];

inline int cal(int i,int x,int j,int y)
{
	return sum[j][y]-sum[i-1][y]-sum[j][x-1]+sum[i-1][x-1];
}

bool ke(int i,int j)
{
	int x,y=1,tmp=0;
	for (x=1;x<=m;x++)
	{
		tmp+=cal(i,x,j,x);
		if (tmp>=ans)
		{
			++y;
			tmp=0;
		}
		if (y>B) return true;
	}
	return false;
}

bool ok()
{
	int x=1,y=1;
	for (i=1;i<=A;i++)
	{
		while (!ke(x,y)) 
		{
			++y;
			if (y>n-A+i) return false;
		}
		x=++y;
	}
	return true;
}

int main()
{
	freopen("brownie.in","r",stdin);
	freopen("brownie.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&A,&B);
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
		{
			scanf("%d",&k);
			sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+k;
		}
	l=1; r=sum[n][m]/(A*B)+1;
	while (l!=r)
	{
		ans=(l+r)>>1;
		if (ok()) l=ans+1;
		else r=ans;
	}
	printf("%d\n",l-1);
	return 0;
}