一个n*m的房间,(x,y)不能分割到某一块内,分割成若干个小块,每一个小块的某一条边一定为房间的边缘,使分割小块的面积最大值最小。
思路:
画图,找规律。每一个小块一定能分成1*x的形状;为了使小块尽量小,应该优先放短的边。分为两种情况,一是房间为边长为奇数的正方形,不能分割的小黑块在正中间,最大面积最小为n/2。另一种情况是非对称的,比较小黑块到上下左右房间边界的值,即为最大面积的最小。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,x,y;
while(~scanf("%d%d%d%d",&n,&m,&x,&y))
{
if(n>m)
{
swap(n,m);
swap(x,y);
}
int ans=(n+1)/2;
if (n==m&&n%2&&x==y&&x==(n+1)/2)//对称情况
ans--;
else if (n!=m)//非对称,考虑形状
{
int h=max(x-1,n-x);
int w=min(y-1,m-y)+1;
if (w>ans)
ans=max(ans,min(h,w));
}
printf("%d\n",ans);
}
return 0;
}