hihoCoder#1042 跑马圈地
经网友jokeren提醒,后面给出的代码虽然可以AC原题,但存在bug,主要是在矩形覆盖情况的判断上处理的不够完全。
看似挺复杂的,但是仔细分析一下可以化简:
首先,不用枚举周长,因为更长的周长总是能够围成更大的面积,所以只要考虑如何在周长为L的前提下枚举面积就行了。
下图中,用蓝色线框表示跑马的路线,灰色矩形表示臭水塘。
假设可以穿越臭水塘,那么:圈地面积=蓝矩形面积 - 蓝矩形内部的灰色矩形面积。

现在不让穿越臭水塘,为了维持面积不变,就需要绕着臭水塘走:

注意:绕路以后,面积不变。
上面这个例子说明:不管你怎么跑马,圈出什么形状的地,都可以转化成一个蓝矩形和黑矩形覆盖的情况(当然如果二者不相交就更简单了)。
所以,不用去考虑圈地的形状,只需要枚举蓝矩形面积,然后减掉臭水塘的面积,就是圈地的面积。
上面的转化看上去很美好,但问题来了,虽然面积不变,但周长可能会变化。仔细分析,一共有这几种情况:
情况I:绕路以后,周长不变:

情况II:绕路以后,周长增加:

情况III:绕路以后,周长变小:

情况IV:矩形不相交,无变化:

情况V:蓝矩形覆盖灰矩形,无变化:

情况VI:这种情况是不合法的,遇到就直接跳过吧:

情况I、IV、V最好,直接计算即可
情况II不考虑,因为周长爆了,不满足周长等于L的条件
情况III也不考虑,因为当计算两个矩形不相交的时候会覆盖到这种情景。
所以,只需要考虑情况I、IV、V即可,是不是瞬间变简单了!
那如何判断是情况I、IV、V呢?
仔细观察,可以发现矩形的重叠情况跟灰矩形在蓝矩形内部的点的数量有关:

如果灰矩形在蓝矩形内部的顶点数分别对应了上面的几种情况。需要注意的是,顶点数为0实际上对应情况V和情况VI,但因为情况VI是非法的,所以这里需要额外判断一下。
代码:
#include <iostream> using namespace std; int n, m, L;
int l, r, t, b; int run_horse(int pl, int pr, int pt, int pb) {
int ll = max(l, pl);
int rr = min(r, pr);
int tt = max(t, pt);
int bb = min(b, pb); if (ll >= rr || tt >= bb)
return (pr - pl) * (pb - pt); int inside = ;
if (ll > pl && ll < pr && tt > pt && tt < pb)
inside++;
if (rr > pl && rr < pr && tt > pt && tt < pb)
inside++;
if (ll > pl && ll < pr && bb > pt && bb < pb)
inside++;
if (rr > pl && rr < pr && bb > pt && bb < pb)
inside++; if (inside == || inside == )
return (pr - pl) * (pb - pt) - (rr - ll) * (bb - tt);
else
return ;
} int main() {
int res = ; cin >> n >> m >> L;
cin >> l >> r >> t >> b; for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
int w = ;
int h = (L - * w) / ;
while (w > && h > ) {
res = max(res, run_horse(j, min(m, j + w), i, min(n, i + h)));
w++;
h = (L - * w) / ;
}
}
} cout << res << endl;
}
hihoCoder#1042 跑马圈地的更多相关文章
- BAT带队烧钱圈地华为们猛追云计算
在和一位创业者交流时,他说现在创业者想从市场脱颖而出太难了,且不论创业本身的不易,更多时候是想做的事情都被BAT广撒网覆盖了. 现实也正是如此,包括影业.在线音乐.车联网等领域,BAT都已涉足.如今, ...
- 不融资、不上市、不快马圈地…“佛系”ZOHO的中国生意经
来源:钛媒体 作者:秦聪慧 "技术比肩SAP.直追微软的这家25岁"非典型"国际大厂会继续佛系下去吗? ZOHO研发中心大楼 在中国,有家相对低调的"舶来&qu ...
- 许小年:宁可踏空,不可断粮<转>
http://www.daonong.com/g/25/xsqy/2014/0716/51074.html 文│许小年 中欧国际工商学院教授 为什么我们企业的创新能力长期处于低水平呢? 深入观察,内心 ...
- SAP的吐槽来源
这几天看了 梅林传奇(英国剧) , 封面是 梅林传奇的男主 对着女主 一脸无语的玩着电脑. 原来 看梅林传奇的时候,以为自己看错了,没有理会到这部剧的真谛,是自己不懂得和发现美,为了滚娘从第二季就弃了 ...
- 地理数据可视化:Simple,Not Easy
如果要给2015年的地理信息行业打一个标签,地理大数据一定是其中之一.在信息技术飞速发展的今天,“大数据”作为一种潮流铺天盖地的席卷了各行各业,从央视的春运迁徙图到旅游热点预测,从大数据工程师奇货可居 ...
- 传统企业,"哀兵必胜"的想法要不得
[文/ 任英杰]同事在内网上发了一篇文章『哀兵必胜』,思量数日,作文应对.文中表达的积极精神让人敬佩,但背后似乎隐含着一股莫名的“情绪”.对行业大格局的基本看法会影响公司转型的成败,觉得还是有必要讨论 ...
- 如何实现室内Wi-Fi无线终端的精准定位
如何实现室内Wi-Fi无线终端的精准定位 如何实现室内Wi-Fi无线终端的精准定位 随着商圈020的兴起,室内定位技术的也如百花争艳般不断涌现.但随着室内Wi-Fi网的架设普及,基于Wi-Fi定位技术 ...
- 收藏:左路Deep Learning+右路Knowledge Graph,谷歌引爆大数据
发表于2013-01-18 11:35| 8827次阅读| 来源sina微博 条评论| 作者邓侃 数据分析智能算法机器学习大数据Google 摘要:文章来自邓侃的博客.数据革命迫在眉睫. 各大公司重兵 ...
- TD-SCDMA风雨20年:中国3G标准的由来以及国家通信战略
.国际电信标准是咋回事? 当年作为通信专业的学生,我曾长期困惑一个问题,为什么同一项通信技术总会有美国和欧洲两种国际标准?比如电话语音的数字化就有欧洲A律和美国u(谬)律两种. 学习后发现,两种标准的 ...
随机推荐
- ACM_素数环(dfs)
Problem Description: 如图所示,环由n个圆组成. 将自然数1,2,...,n分别放入每个圆中,并且两个相邻圆中的数字总和应为素数. 注意:第一个圆圈的数量应该始终为1. Input ...
- Oracle查询使用空间比较大的前15个表
-- 查询使用空间比较大的前15个表 select a.* from( ,2) all_size from dba_segments where SEGMENT_TYPE='TABLE' order ...
- chromedriver与chrome版本对应
今天把手头有的一些关于selenium测试的资源整理了一下,分享出来. 1. 所有版本chrome下载 是不是很难找到老版本的chrome?博主收集了几个下载chrome老版本的网站,其中哪个下载的是 ...
- python_one-day
python入门_(1) 作者:_晓冬 归档:学习笔记 2017/9/9 目 录 第1章 练习... 1 1.1 格式化输出... 1 1.2 流程控制if..else. 1 1.3 流程控制whi ...
- windows系统下在忘记安装make的Cygwin中如何正确安装make(图文详解)
由于我在安装cygwin时忘了包含make包,所以安装后发现我在bash中无法使用make命令.但是一般在cygwin下面的软件都是要用make来实现编译和安装的.没有make,又如何编译生成make ...
- Redis相关问题收集
问题一.强制关闭Redis快照导致不能持久化 MISCONF Redis is configured to save RDB snapshots, but is currently not able ...
- time模块、datetime模块讲解
time模块清楚三种格式的时间相互转换 import time# 时间分为三种格式#1.时间戳start= time.time()time.sleep(3)stop= time.time()print ...
- 归并排序算法及其JS实现
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(con ...
- git---安装及配置
git官网:https://git-scm.com 安装: 官网下载->一路Next->安装完成 配置git: 1.win+r进入windows命令行 2.注册: git config - ...
- Flutter web环境变量搭建及开发
使用flutter开发app已有三个月,有一些行为形成了惯性,在搭建flutter web环境变量时走了不少的坑,分享出来,免得其他小伙伴再走一遍. 首先flutter的版本要使用1.5及以上版本 d ...