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);
        }

        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值