题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5301
题意:有n*m的矩阵,其中处于(x,y)处的方格被删除,要求将矩阵用矩形填充,求其中面积最大的矩形的最小面积是多少。
解析:一道思维题,得想清楚各种情况,首先r=(n+1)/2就是不考虑删除(x,y)时的答案(中间方格距离上下边缘的距离),考虑上删除(x,y)那么它可能会影响到周围的四个方格使得最小矩形变大,现在如果n > m,则swap(n,m), swap(x,y),那么对于这个n<m即列数大于行数的矩阵,只考虑(x,y)上下两个相邻方格即可。
令c=max(x-1,n-x);代表(x,y)的上下相邻方格与上下边缘距离,由于上方方格只能到上边缘,下方方格只能到下边缘,所以取两者最大的,即确定影响最大的是上方方格还是下方方格;
d=min(y,m-y+1);代表(x,y)影响最大的方格与左右边缘距离,由于方格既能联通至左边缘又能联通至右边缘,所以取两者最小的;那么当(x-1!=n-x)且(d>r)时说明删除(x,y)会使得受影响最大的方格与边缘距离增大。此时c与d中较小者即是答案。
此外还要考虑当行列数相同为奇数且(x,y)处于正中间的情况,此时会使得答案减小。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,x,y,c,d,r;
int main()
{
while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF)
{
if(n>m)
{
swap(n,m);
swap(x,y);
}
r=(n+1)/2; //r是未删除(x,y)时的最大长度
c=max(x-1,n-x);
d=min(y,m-y+1);
if(r<d&&x-1!=n-x)//此时说明删除(x,y)会使得答案产生变化
r=min(c,d);
if(n==m&&(n&1)&&x==y&&(x*2-1==n))
r=n/2;
printf("%d\n",r);
}
return 0;
}