【Kickstart】2019 Round A - Parcels
解法
BFS+二分,首先通过BFS能遍历得到每个位置到最近的office的距离,同时也能得到最大值r
与些同时设置l=0
,然后就开始对[l,r]
进行二分查找
判断k
是否可行的条件是:是否存在一个位置(i,j)
,使得在这里放一个office之后所有grid的距离都不超过k
,找到一个最小的k即可
具体说来,需要将曼哈顿距离进行转换:dis(⟨x1,y1⟩,⟨x2,y2⟩)=max{abs((x1+y1)−(x2+y2)),abs((x1−y2)−(x2−y2))}dis(\langle x_1,y_1\rangle,\langle x_2,y_2\rangle) = \\max\{abs((x_1+y_1)-(x_2+y_2)), abs((x_1-y_2)-(x_2-y_2))\}dis(⟨x1,y1⟩,⟨x2,y2⟩)=max{abs((x1+y1)−(x2+y2)),abs((x1−y2)−(x2−y2))}
现在把⟨x2,y2⟩\langle x_2,y_2\rangle⟨x2,y2⟩设置为假如要放office的点,那么我们要在所有原始距离大于k
的grid里找出放置新office之后的距离的最大值,并判断它是否不超过k
。
而这个距离的最大值,将从x1+y1x_1+y_1x1+y1的最大值、最小值,以及x2+y2x_2+y_2x2+y2的最大值、最小值之中产生。
因此,遍历两遍O(RC)
的时间就可以完成了
#!/usr/bin/env python
# -*- coding: utf-8 -*-from collections import dequeMOD = 10**9+7dx,dy = [0,0,-1,1],[-1,1,0,0]def solve(R,C,lines):dis = []bfs = deque()for i,line in enumerate(lines):dis.append([])for j in range(C):if line[j] == '0':dis[-1].append(-1)else:dis[-1].append(0)bfs.append((i, j))def issafe(i, j):return i >= 0 and j >= 0 and i < R and j < Cr = 0while bfs:i, j = bfs.popleft()for d in range(4):ni, nj = i + dx[d], j + dy[d]if issafe(ni, nj) and dis[ni][nj] == -1:dis[ni][nj] = dis[i][j] + 1r = max(r, dis[ni][nj])bfs.append((ni, nj))def isable(k):maxA,maxM,minA,minM = -R-C,-R-C,R+C,R+Cn = 0for i in range(R):for j in range(C):if dis[i][j]>k:n += 1maxA = max(maxA, i+j)maxM = max(maxM, i-j)minA = min(minA, i+j)minM = min(minM, i-j)if n==0:return Truefor i in range(R):for j in range(C):A,M = i+j,i-jif dis[i][j]>0 and max(abs(maxA-A),abs(minA-A),abs(maxM-M),abs(minM-M))<=k:return Truereturn Falsel = 0while l < r:mid = (l + r) >> 1if isable(mid):r = midelse:l = mid+1return rif __name__ == '__main__':t = int(input())for _ in range(1, t + 1):R,C = map(int,input().split())lines = []for i in range(R):lines.append(input())print("Case #{}: {}".format(_,solve(R,C,lines)))
【Kickstart】2019 Round A - Parcels相关推荐
- 【最新】2019年最新青甘大环线攻略收藏版!
青海分享 首页 快讯 资讯 习俗 分享 大美青海 更多 青海分享 我要投稿 首页精彩分享 [最新]2019年最新青甘大环线攻略收藏版! 青海分享 • 2019-09-06 13:12 • 精彩分享 • ...
- 2019暨南大学计算机考研群,【汇总】2019暨南大学各分院考研群,推荐加入
原标题:[汇总]2019暨南大学各分院考研群,推荐加入 研途宝考研网为大家汇总2019暨南大学各分院考研群,推荐2019准备考研的伙伴们加入. 在这里,我们会不定期发布最新的考研资讯,考研相关资料共享 ...
- 【下载】2019考研视频教程大全
视频教程内容: 01[备考指导讲座] 2019考研规划[院校专业选择] 英语 2019考研英语[商志] 2019考研英语[谭建波词汇精讲基础班] 2019考研英语[谭建波写作基础班] 2019考研英语 ...
- 【最新】2019年注册测绘师考试测绘案例分析真题及答案解析
[最新]2019年注册测绘师考试测绘案例分析历年真题及答案解析 [最新]2022年注册测绘师考试测绘案例分析真题及参考答案 [最新]2021年注册测绘师考试测绘案例分析真题及参考答案 [最新]2020 ...
- 开元弧焊机器人编程_【数据】2019年中国焊接机器人市场发展现状与趋势分析...
导 语 READ 焊接机器人市场分析 焊接机器人是从事焊接(包括切割与喷涂)的工业机器人.根据国际标准化组织(ISO)工业机器人属于标准焊接机器人的定义,工业机器人是一种多用途的.可重复编程的自动控制 ...
- 【蓝桥】2019第十届蓝桥杯省赛C/C++大学B组题目及感想(考场代码和思考)
比赛时间:2019年3月24日礼拜天 上午9点到下午1点 说明 本文题目和代码为考试结束以后返回考场拷下来的 文中答案不保证正确(感觉错的地方还不少) 本文解题思路和代码只反映本人考场临场发挥情况,真 ...
- 【重要】2019年美赛(MCM/ICM)的参赛建议
2019MCM/ICM将于2019年1月25日上午6:00-29日上午9:00(北京时间)举行,准备参加竞赛的同学们你准备好了吗?这里特别给你提个醒,确保你成功参赛!一. 认真熟悉参赛规则准备参加美赛 ...
- 【考试】2019.3二级C语言
前面说的固然重要,想要拿证,那些已经足矣,但是见到有更好的软件还是想分享出来,这样可以给大家多方面的选择以及全面的复习备考. 记得七月份也曾发过计算机等级考试三级的文章,那是我个人备考经验,里面有相关 ...
- 【方向盘】2019年感悟关键词:裁员、技术驱动、分享精神、能力边界
2019很艰难,2020更艰难? 本文已被https://yourbatman.cn收录:女娲Knife-Initializr工程可公开访问啦:程序员专用网盘https://wangpan.yourb ...
最新文章
- 用.NET CF进行HardReset?
- SAP Spartacus里使用Observable访问Component数据
- Linux C 时间函数
- php 判断radio选中哪个,jquery如何判断单选按钮radio是否选中
- 【计算机网络复习 物理层】2.1.2 数据通信基础知识
- constraint mysql_MySQL(Constraint)
- CEF新版发布 添加多项激动人心的新特性
- 更新CocoaPods1.1.0碰到的问题及知识点
- 一二线城市有哪些值得加入的互联网公司?
- spark 安装详细步骤
- 2、CSS动画之行走的米兔、奔跑的小人
- 神州数码招聘软件测试,神州数码面试经验
- fireworks html制作,fireworks怎么制作网页
- 深度学习理论与技术的重点研究方向
- 16个Javascript的Web UI库、框架及工具包
- 宅基地一码溯源、一码统管
- java matcher.group_详解正则表达式Matcher类中group方法
- oracle 计算当前日期是今年的第几周的计算方法
- 小米球ngrok 给你惊喜
- 2012 成都网络赛小记