HDU 5301 Buildings(找规律)

题目链接: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;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值