解法

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相关推荐

  1. 【最新】2019年最新青甘大环线攻略收藏版!

    青海分享 首页 快讯 资讯 习俗 分享 大美青海 更多 青海分享 我要投稿 首页精彩分享 [最新]2019年最新青甘大环线攻略收藏版! 青海分享 • 2019-09-06 13:12 • 精彩分享 • ...

  2. 2019暨南大学计算机考研群,【汇总】2019暨南大学各分院考研群,推荐加入

    原标题:[汇总]2019暨南大学各分院考研群,推荐加入 研途宝考研网为大家汇总2019暨南大学各分院考研群,推荐2019准备考研的伙伴们加入. 在这里,我们会不定期发布最新的考研资讯,考研相关资料共享 ...

  3. 【下载】2019考研视频教程大全

    视频教程内容: 01[备考指导讲座] 2019考研规划[院校专业选择] 英语 2019考研英语[商志] 2019考研英语[谭建波词汇精讲基础班] 2019考研英语[谭建波写作基础班] 2019考研英语 ...

  4. 【最新】2019年注册测绘师考试测绘案例分析真题及答案解析

    [最新]2019年注册测绘师考试测绘案例分析历年真题及答案解析 [最新]2022年注册测绘师考试测绘案例分析真题及参考答案 [最新]2021年注册测绘师考试测绘案例分析真题及参考答案 [最新]2020 ...

  5. 开元弧焊机器人编程_【数据】2019年中国焊接机器人市场发展现状与趋势分析...

    导 语 READ 焊接机器人市场分析 焊接机器人是从事焊接(包括切割与喷涂)的工业机器人.根据国际标准化组织(ISO)工业机器人属于标准焊接机器人的定义,工业机器人是一种多用途的.可重复编程的自动控制 ...

  6. 【蓝桥】2019第十届蓝桥杯省赛C/C++大学B组题目及感想(考场代码和思考)

    比赛时间:2019年3月24日礼拜天 上午9点到下午1点 说明 本文题目和代码为考试结束以后返回考场拷下来的 文中答案不保证正确(感觉错的地方还不少) 本文解题思路和代码只反映本人考场临场发挥情况,真 ...

  7. 【重要】2019年美赛(MCM/ICM)的参赛建议

    2019MCM/ICM将于2019年1月25日上午6:00-29日上午9:00(北京时间)举行,准备参加竞赛的同学们你准备好了吗?这里特别给你提个醒,确保你成功参赛!一. 认真熟悉参赛规则准备参加美赛 ...

  8. 【考试】2019.3二级C语言

    前面说的固然重要,想要拿证,那些已经足矣,但是见到有更好的软件还是想分享出来,这样可以给大家多方面的选择以及全面的复习备考. 记得七月份也曾发过计算机等级考试三级的文章,那是我个人备考经验,里面有相关 ...

  9. 【方向盘】2019年感悟关键词:裁员、技术驱动、分享精神、能力边界

    2019很艰难,2020更艰难? 本文已被https://yourbatman.cn收录:女娲Knife-Initializr工程可公开访问啦:程序员专用网盘https://wangpan.yourb ...

最新文章

  1. 用.NET CF进行HardReset?
  2. SAP Spartacus里使用Observable访问Component数据
  3. Linux C 时间函数
  4. php 判断radio选中哪个,jquery如何判断单选按钮radio是否选中
  5. 【计算机网络复习 物理层】2.1.2 数据通信基础知识
  6. constraint mysql_MySQL(Constraint)
  7. CEF新版发布 添加多项激动人心的新特性
  8. 更新CocoaPods1.1.0碰到的问题及知识点
  9. 一二线城市有哪些值得加入的互联网公司?
  10. spark 安装详细步骤
  11. 2、CSS动画之行走的米兔、奔跑的小人
  12. 神州数码招聘软件测试,神州数码面试经验
  13. fireworks html制作,fireworks怎么制作网页
  14. 深度学习理论与技术的重点研究方向
  15. 16个Javascript的Web UI库、框架及工具包
  16. 宅基地一码溯源、一码统管
  17. java matcher.group_详解正则表达式Matcher类中group方法
  18. oracle 计算当前日期是今年的第几周的计算方法
  19. 小米球ngrok 给你惊喜
  20. 2012 成都网络赛小记

热门文章

  1. makefile中常用函数
  2. excel 文件加密
  3. 浅谈中国2050年人均受教育年限问题
  4. 2019 年度最受欢迎的中国开源软件出炉!!
  5. 好好说话之Use After Free
  6. python将横转为竖_【后端开发】python数据竖着怎么变横的?
  7. python用函数对列表删除_关于python:如何使用range()函数从列表中删除项目时迭代列表?...
  8. BUCTOJ 3322 QQ号与质数
  9. 嵌入式编程中的堆栈溢出检测
  10. Quoted-Printable编码原理及代码实现