题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5301
题意:
在n*m的矩形里面,其中有一块不能用来建房子,位置标记为(x,y)
房子必须有一个窗户,也就是说,必须和最外圈联通,房子用一个矩形表示,房子面积的最大值尽可能小
问:一房子面积的最大值
解题思路:
最直接的办法找规律
1、特殊情况:(特判)
n=m且是奇数,(x,y)是在最中央的位置
这个时候面积最大值就是n/2
2、一般情况:
调换n,m的位置,将n固定为较小边
注意:n,m位置颠倒后,相应的x,y也必须颠倒
多校的时候就是x,y的位置忘记换了,wa了两把!!!!!
如果没有(x,y)这个点,那最大的就是(n+1)/2,就是沿着m方向分为上下两个部分
记:s1 = (n+1)/2 s2 = n-s1(就是上下两部分的面积)
但是有(x,y)这个点,就会产生一种新的矩形,不妨记为s3
(1)当(x,y)在s1这边,且x!=s1,那么s3就等于下图三个阴影中最小的一块
如果是往左边或右边,除了产生s3,同时会产生小于s1的矩形,由于小于s1,就不用放进去比较了
如果是往下,只会产生s3
(2)如果x=s1 或 x=s1+1
当x=s1的时候,会产生红色阴影部分
当x=s1+1的时候,会产生蓝色阴影部分
这两部分明显比s1,s2都小,但是为了整体比较,仍要算出s3的值
(3)x>s1+1 跟(1)同一性质
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <math.h>
using namespace std;
int main()
{
int n,m,x,y;
while(~scanf("%d%d%d%d",&n,&m,&x,&y))
{
if(n > m)
swap(n, m), swap(x, y);
int s1 = (n+1)/2;
int s2 = n-s1;
int s3;
if(n%2==1 && m==n && x==y && (n+1)/2==y)
{
printf("%d\n",n/2);
continue;
}
if(x<s1) s3 = min(s1-x+s2,min(y,m-y+1));
if(x==s1) s3=s1-1;
if(x==s1+1) s3=s2-1;
if(x>s1+1) s3 = min(x-1,min(y,m-y+1));
printf("%d\n",max(s1,max(s2,s3)));
}
return 0;
}