1. 程式人生 > >hdu5301(2015多校2)--Buildings(構造)

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

das pos floor eof text new tom fcm 20px

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 2
3 3 1 1

Sample Output
1
2

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


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