记录编号 23785 评测结果 AAAAAAAAAA
题目名称 Brownie Slicing 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.455 s
提交时间 2011-03-20 14:09:41 内存使用 1.23 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>

const int MAXN=505;

int A,B,R,C;
int a[MAXN][MAXN];
int sum[MAXN];
bool judge(int mid)
{
	int na=0,ni=1;
	memset(sum,0,sizeof(sum));
	while(na<A&&ni<=R)
	{
		for(int i=1;i<=C;i++)
			sum[i]+=a[ni][i];
		int nb=0;
		for(int i=1,ns=0;i<=C&&nb<B;i++)
		{
			ns+=sum[i];
			if (ns>=mid) nb++,ns=0;
		}
		if (nb==B)
		{
			memset(sum,0,sizeof(sum));
			na++;
		}
		ni++;
	}
	return (na==A);
}

void solve()
{
	int l=0,r=2000000;
	while(l+1<r)
	{
		int mid=((long long)(l)+r)/2;
		if (judge(mid)) l=mid;
		else r=mid-1;
	}
	if (l==r) printf("%d\n",l);
	else if (judge(r)) printf("%d\n",r);
	else printf("%d\n",l);
}

int main()
{
	freopen("brownie.in","r",stdin);
	freopen("brownie.out","w",stdout);
	scanf("%d%d%d%d",&R,&C,&A,&B);
	for(int i=1;i<=R;i++)
		for(int j=1;j<=C;j++)
			scanf("%d",a[i]+j);
	solve();
	return 0;
}