2015 Multi-University Training Contest 2 - Buildings

题目链接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;
}

猜你喜欢

转载自blog.csdn.net/sdau20163942/article/details/81082994