2015多校联合训练赛hdu 5301 Buildings 2015 Multi-University Training Contest 2 简单题



Buildings

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


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×m , where each apartment is a smaller rectangle with dimensions  a×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×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(1n,m108,n×m>1,1xn,1ym) .
 

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×1 apartments. The answer is 1. Case 2:
You can split the floor into three 2×1 apartments and two 1×1 apartments. The answer is 2.
If you want to split the floor into eight 1×1 apartments, it will be unacceptable because the apartment located on (2,2) can't have windows.
 

Source
 

题意:

n*m列的矩阵,删除一个格子x,y。用矩形来填充矩阵。且矩形至少有一边是在矩阵的边缘上。求满足条件的矩形填充方式中面积最大的矩形,要使得该最大矩形的面积最小。

分析:

任何矩形都可以分为宽度为1的小矩形,所以只考虑矩形的可以的最小长度即可。

讨论:

不删除格子时:最小长度为min((n+1)/2,(m+1)/2) = len

n = m:

       n为奇数,且当x,y在正中心的时候,len- 1即可

      其他条件len不变 ==== 显然成立

n != m:

    如果n > m swap(n,m), swap(x,y)

       由于对称性,把矩阵分为四块,把x,y变换到矩阵的右上角。

      可以知道 删除点后len只能变大不能变小。

       且即使增大不会大于 (m+1)/2

       0 0 0 0 0 0 0 0 0 0

       0 x 0 0 0 0 0  0 0 0

       1 3 0.... 

       0 2 0 ....

      如图:x下方的3必须被矩形覆盖,那么长度 为   min(1 到3的长度,2到3的长度)

     然后取min((m+1)/2, max(len,min(1--->3,2---->3)))即可



#include<cstdio>
#include<cstring>
#include<algorithm>

#include<iostream>
using namespace std;
#define ll long long

int main(){
    ll n,m,x,y;
    while(cin>>n>>m>>x>>y){
        if(n > m ){
            swap(n,m);
            swap(x,y);
        }
        if(x > n - x + 1)
            x = n - x + 1;
        if(y > m - y + 1)
            y = m - y + 1;
        ll hm = ( m + 1) /2, hn = (n+1)/2;
        ll ans = min(hm,hn);
        if(m == n){
            if(m % 2 == 1){
                if( x == hn && y == hm)
                    ans--;
            }
        }
        else {
            ll f = min(y,n-x);
            ans = max(ans,f);
            ans = min(ans,hm);
        }
        cout<<ans<<endl;
    }
    return 0;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GDRetop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值