hdu5301(2015多校2)--Buildings(构造)

来源:互联网 发布:心动网络 上海 编辑:程序博客网 时间:2024/06/02 05:57

Buildings

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 472    Accepted Submission(s): 104


Problem Description
Your current task is to make a ground plan for a residential building located in HZXJHS. So you must determine a way to split the floor building with walls to make apartments in the shape of a rectangle. Each built wall must be paralled to the building's sides.

The floor is represented in the ground plan as a large rectangle with dimensions $n \times m$, where each apartment is a smaller rectangle with dimensions $a\times b$ located inside. For each apartment, its dimensions can be different from each other. The number $a$ and $b$ must be integers.

Additionally, the apartments must completely cover the floor without one $1 \times 1$ square located on $(x,y)$. The apartments must not intersect, but they can touch.

For this example, this is a sample of $n=2,m=3,x=2,y=2$.



To prevent darkness indoors, the apartments must have windows. Therefore, each apartment must share its at least one side with the edge of the rectangle representing the floor so it is possible to place a window.

Your boss XXY wants to minimize the maximum areas of all apartments, now it's your turn to tell him the answer.
 

Input
There are at most $10000$ testcases.
For each testcase, only four space-separated integers, $n,m,x,y(1\leq n,m \leq 10^8,n\times m > 1, 1\leq x \leq n, 1 \leq y \leq m)$.
 

Output
For each testcase, print only one interger, representing the answer.
 

Sample Input
2 3 2 23 3 1 1
 

Sample Output
12
Hint
Case 1 :
You can split the floor into five $1 \times 1$ apartments. The answer is 1.Case 2:
You can split the floor into three $2 \times 1$ apartments and two $1\times 1$ apartments. The answer is 2.
If you want to split the floor into eight $1 \times 1$ apartments, it will be unacceptable because the apartment located on (2,2) can't have windows.



题目大意:有n*m的一个矩形地面,要建公寓,现在要求公寓里的房间怎么划分,要求每间房屋都为一个矩形,而且要有一侧为矩形的边,除(x,y)位置外不能有空余,(x,y)位置不能建房间,要让房屋面积最大的那个的面积尽量的小,问最小会是多少


如图,黑色的是(x,y),那么它的上下两块只可被有三个边的某一个覆盖掉,为了让最大的面积最小,要让宽为1,长为三边到空白方格的最小值,还有除了黑色部分的多于部分,要让他们被覆盖掉,可以用上下两条边来建房屋高为(m+1)/2,找出最大的。




#include <cstdio>#include <cstring>#include <algorithm>using namespace std ;int main() {    int n , m , x , y , ans , min1 , min2 ;    while( scanf("%d %d %d %d", &n, &m, &x, &y) != EOF ) {        if( n > m ) {            swap(n,m) ;            swap(x,y) ;        }        if( n == 1 ) {            printf("1\n") ;            continue ;        }        min1 = min(x-1,min(y,m-y+1)) ;        min2 = min(n-x,min(y,m-y+1)) ;        ans = (n+1)/2 ;        if( n == m && n%2 && ans == x && ans == y )            ans-- ;        printf("%d\n", max(ans,max(min1,min2) )) ;    }    return 0 ;}


0 0