HDU 5301_Buildings

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

Sample Output
  
  
1 2

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


这道题真的做了好久,也和别人讨论了一个下午,好吧,其实是我没有找到规律。这道题的做法是,首先弄个交换的函数,把大矩阵中大较大边长放到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;
}



  
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值