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
- HDU 5301 Buildings(找规律)
- HDU 5301 Building (找规律)
- [找规律] 多校联合第二场 B题 Buildings
- hdu 1597 找规律
- HDU-1597(找规律)
- hdu 4475 找规律
- hdu 1020 找规律
- hdu 1868 找规律
- hdu 1041 找规律
- hdu 4602 找规律
- hdu 4662 找规律
- HDU-4704 找规律
- hdu (找规律)
- HDU 4790 找规律
- HDU 1719 找规律
- HDU 5703--找规律
- HDU 1005 找规律
- HDU 5301 - Buildings(技巧)
- Cover It Up - For TV Lovers
- The specified child already has a parent. You must call removeView() on the chil
- 简单的Java Web工程,实现登录注册
- 二叉堆
- 快速排序
- HDU 5301 Buildings(找规律)
- CentOS 6.3下配置软RAID(Software RAID)
- 关于CSS样式的笔记
- 多校第一场1006
- iOS开发分分钟搞定C语言 —— 数据类型
- 初涉iOS 通知机制
- topocoder Arena 客户端无法打开、下载jar包失败、jar包签名
- SVM源代码网站
- Linux PPTP VPN 记录登陆用户名