zoukankan      html  css  js  c++  java
  • 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;
    }
    







  • 相关阅读:
    K8S 本地 配置 Local PV 实践
    Filebeat 收集K8S 日志,生产环境实践
    K8S 上部署 Redis-cluster 三主三从 集群
    Kubernetes 用户流量接入方案
    给Nginx配置日志格式和调整日期格式
    唇亡齿寒,运维与安全
    Nginx记录用户请求Header到access log
    Kubernetes中利用Kubectl set 让Deployment更新镜像
    故障管理:故障定级和定责
    使用 Elastic 技术栈构建 Kubernetes全栈监控
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7029088.html
Copyright © 2011-2022 走看看