hdu5301 填满房间最大的矩形的最小值

首先使房间的行数n<列数,没有阻碍的话,是一半的n*1的矩形,有阻碍的话,除了在正中央的情况值比原来小1外,如果采用上下去填充的话是max(上,下),如果用左右去填充的话是min(左右),因为max(左右)那一部分可以采用上下的方式去填充,只要一半的n就就可以了,   然后取min (max(上,下),min(左右)),最个值如果比一半的n小的话,就改为一半的n,因为其它列还需要填充的

#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1 | 1
#define lowbit(x) x&(-x)
using namespace std;
const int N=5e5+10;
long long INF=-1e15;
const int MOD=1e9+7;
int T,n,m,k,x,y;
int main()
{
#ifndef  ONLINE_JUDGE
 freopen("aaa","r",stdin);
#endif
    int T;
    while(~scanf("%d%d%d%d",&n,&m,&x,&y)){
        if(n<=2 || m<=2){
            puts("1");
            continue;
        }
        if(n>m){
            swap(n,m);
            swap(x,y);
        }
        int len=(n+1)/2;
        if(n==m && n&1 && x==y && x==(1+n)/2){
            len--;
        }else{
            int right=m-y+1;
            int left=y;
            int up=x-1;
            int down=n-x;
           len=max(min(max(up,down),min(left,right)),len);

        }
        printf("%d\n",len);

    }

    return 0;
}



你可能感兴趣的:(hdu5301 填满房间最大的矩形的最小值)