HDU 5301_Buildings

来源:互联网 发布:java 进程注入 编辑:程序博客网 时间:2024/06/04 20:04
Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1360    Accepted Submission(s): 380


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

Sample Output
12

这道题的意思是,给你一个矩阵,然后矩阵里面有个黑点,要你用更小的矩阵来覆盖这个大的矩阵,而且每个小的矩阵至少有一条边是在大矩阵的边缘上的,但是不能覆盖那个黑点,问,在所有覆盖大矩阵的方案中,哪个方案的最大矩阵面积最小。


这道题真的做了好久,也和别人讨论了一个下午,好吧,其实是我没有找到规律。这道题的做法是,首先弄个交换的函数,把大矩阵中大较大边长放到N,如果要交换,顺便拿x和y也要同时交换,从黑点出发,计算黑点上下左右四个小方块分别到另外三条边的距离,如果是黑点上面的点,就是求出到上面,左边和到右边的距离,取最小值,这样就有四个最小值,再取这四个最小值的最大值,再把这个最大值和较小边长的一半进行比较,取较大值,就是结果。其中要注意的是,当大矩阵的边长都是奇数而且相同,并且黑点在最中间的那个点,这种情况要单独讨论,WA了那么久就是WA在这。


#include<iostream>#include<algorithm>using namespace std;int main(){int n,m,x,y;while(cin>>n>>m>>x>>y){int answer=0;if(n==m&&n%2!=0&&x==y&&x==(n+1)/2){if(n==m)  answer=(n+1)/2-1;}else{if(n>m)  swap(n,m),swap(x,y);int ans=0;int nut=0;ans=(n+1)/2;nut=(m+1)/2;int a=0,b=0,c=0,d=0;a=min(y,min(x-1,m-y+1));b=min(y-1,min(x,n-x+1));c=min(n-x,min(y,m-y+1));d=min(n-x+1,min(x,m-y));int sum=0;sum=max(a,max(b,max(c,d)));answer=max(sum,min(ans,nut));}cout<<answer<<endl;}return 0;}



0 0
原创粉丝点击