HDU 5301--Buildings(思维)

http://acm.hdu.edu.cn/showproblem.php?pid=5301

题意:n*m的矩形中[x,y]位置不能用,其他位置要全面分成矩形,且每个举行都要临着大矩形的其中一条边界,求每种可能情况  中最大矩形面积的最小值

思路:一直感觉能做,是个思维,但是大概是思路不够清晰,一直WA,搜了下题解,都是说是思维题,规律题,就一直在自己推规律,,最后终于终于推出来了,我的思路是,先是将大矩形旋转成n<=m的矩形,x,y也对应交换,然后以y列所有分割,取较小的那侧,较大的一侧按列长度平分成小矩形,即(n+1)/2;较小的一侧比较按行分割还是按列分割如何最优。

       特判【x,y】在靠边的一列的情况。特殊情况还有n==1,2,3的情况和[x,y]在大矩形正中间的情况

感想:这个题做得真的糟心。。一直忽略了【x,y】在正中间的情况,后来画图,凑巧画出来了。。不然还得WA  QAQ

拓展:题意 中的一个格子不能占用可以换成一个矩形不能占用。,做法是一样的

代码:

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
int n,m,x,y,ans;
int main()
{
    while(~scanf("%d%d%d%d",&n,&m,&x,&y))
    {
        if(n>m) {swap(n,m);swap(x,y);}
        if(n==1||n==2) printf("1\n");
        else if(n==3)
        {
            if(m==3&&x==2&&y==2) printf("1\n");
            else printf("2\n");
        }
        else {
                if(n==m&&x==y&&x==(n+1)/2)
                printf("%d\n",n/2);
        else
        {
            int a,b,c,d;
                a=min(y-1,m-y);
                b=min(x-1,n-x);
                c=max(x-1,n-x);
                d=max(b+1,c);
                if(a==0) ans=0;
                else
                {
                    ans=min(d,a+1);
                }
                ans=max(ans,(n+1)/2);
                printf("%d\n",ans);
        }

        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37868325/article/details/81094328