HDU 5301 Buildings(找规律)

来源:互联网 发布:vscode 大小写快捷键 编辑:程序博客网 时间:2024/05/16 19:06

题目链接: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
原创粉丝点击