当前位置: 首页 > news >正文

机试算法模拟题 服务中心选址

题目描述

一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心到所有区域的距离的总和最小。

给你一个数组positions,其中positions[i] = [left, right] 表示第 i 个区域在街道上的位置,其中left代表区域的左侧的起点,right代表区域的右侧终点,假设服务中心的位置为location:

如果第 i 个区域的右侧终点right满足 right < location,则第 i 个区域到服务中心的距离为 location - right;
如果第 i 个区域的左侧起点left 满足 left > location,则第 i 个区域到服务中心的距离为left - location;
如果第 i 个区域的两侧left,right满足left <= location <= right,则第 i 个区域到服务中心的距离为0
选择最佳的服务中心位置为location,请返回最佳的服务中心位置到所有区域的距离总和的最小值。

输入描述

先输入区域数组positions的长度n(1 ≤ n ≤ 10^5)

接下来 n 行每行输入成对的left和right值,以空格隔开

-10^9 <left ≤ 10^9
-10^9 <right ≤ 10^9

输出描述

输出为location

输入3
1 2
3 4
10 20
输出8
输入6
1 3
4 9
2 15
6 27
15 17
5 8
输出12
输入16
41 67
0 34
24 69
58 78
62 64
5 45
27 81
61 91
42 95
27 36
4 91
2 53
82 92
16 21
18 95
26 47
输出127

题目解析

此题如果用暴力搜索肯定是超时的
从直觉上来说,肯定是中间位置取得最小值
仔细观察可以发现,当服务中心在两个街区外的中间时,两个街区的距离之和是一个定值。如下图蓝色线,当中心x在B点、C点之间时,AB到x的距离与CD到x的距离之和是一个定值,结果等于BC的距离。而越过这个范围,其值就会升高。
当我们再加入两个更靠近的街区EF和GH,这两个街区到x的距离同样出现前述现象(红色线)。而将两者加起来的结果是棕色线。棕色线就是我们求的距离之和。
从这推论可以发现,假设这些街区可以划分为之间没有重叠的两个集合,这些街区的最低距离就在这两个集合之间。

在这里插入图片描述
此时就有两个问题
1.怎么保证最小值一定会落在这个区间?而且其实EF可以和CD配对啊?
这其实是一种贪心算法,所以要让BC覆盖FG。
解决方法就是按照街区的右端点和左端点分别排序,
在配对的时候保证选择的街区右端点F一定在B之右,G和C的关系同理
2.其他不成对的街区就不会干扰吗?
仔细考虑,街区如果不成对的原因要么是最后剩下的街区全部在某一部分共同重叠(不然如果一个街区有两个以上分离开的部分被”其他街区“重叠,就意味着这些”其他街区“可以配对,因为重叠区域的边界一定是某个街区的边界),要么是只剩一个街区没法配队。由于题目说x所在的街区与x的距离为0,只要把x移到这个重叠或者单独街区上就可以无视掉这些街区。

import sys
#输入数据
data=[]
n=int(sys.stdin.readline())#用input()也没关系
for i in range(n):data.append(list(map(int,sys.stdin.readline().split())))#将左端点和右端点各自排序
left_sorted_index=sorted(list(range(n)),key=lambda x:data[x][0])
right_sorted_index=sorted(list(range(n)),key=lambda x:data[x][1])ans=0i=0
j=n-1
#配队
while data[right_sorted_index[i]][1]<data[left_sorted_index[j]][0] and i<j:ans=ans+data[left_sorted_index[j]][0]-data[right_sorted_index[i]][1]i+=1j-=1print(ans)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 利用命令模式构建高效的手游后端架构
  • Reflection反射——Class类
  • 大模型训练数据库Common Crawl
  • Python判断两张图片的相似度
  • 汽车免拆诊断案例 | 2013款捷豹XF车偶尔无法起动
  • Jupyter Notebook 修改默认路径
  • 【Linux】:信号的保存和信号处理
  • CCF推荐C类会议和期刊总结:(计算机体系结构/并行与分布计算/存储系统领域)
  • macos 系统文件操作时提示 Read-only file system 解决方法
  • 计算机网络--第六章应用层
  • React实现虚拟列表的优秀库介绍
  • 隐马尔可夫模型(Hidden Markov Model,HMM)—有监督学习方法、概率模型、生成模型
  • 排序方法sort使用方式不同而产生的不同结果,附力扣179思路
  • [001-03-007].第07节:Redis中的事务
  • 【数据结构与算法 | 灵神题单 | 快慢指针(链表)篇】力扣876, 2095, 234
  • (三)从jvm层面了解线程的启动和停止
  • centos安装java运行环境jdk+tomcat
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • k个最大的数及变种小结
  • Lucene解析 - 基本概念
  • Mithril.js 入门介绍
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • nginx 配置多 域名 + 多 https
  • Python打包系统简单入门
  • react-native 安卓真机环境搭建
  • ubuntu 下nginx安装 并支持https协议
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 深度学习中的信息论知识详解
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #AngularJS#$sce.trustAsResourceUrl
  • #if等命令的学习
  • (1)Jupyter Notebook 下载及安装
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (二十六)Java 数据结构
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (四)JPA - JQPL 实现增删改查
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)shell调试方法
  • .Net - 类的介绍
  • .Net IE10 _doPostBack 未定义
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net下简单快捷的数值高低位切换
  • //解决validator验证插件多个name相同只验证第一的问题
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [000-01-030].Zookeeper学习大纲
  • [16/N]论得趣
  • [Algorithm][综合训练][体育课测验(二)][合唱队形][宵暗的妖怪]详细讲解
  • [Bugku] web-CTF靶场系列系列详解⑥!!!
  • [C#]winform基于opencvsharp结合Diffusion-Low-Light算法实现低光图像增强黑暗图片变亮变清晰
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [DevEpxress]GridControl 显示Gif动画