题目描述

在一条数轴上有 N 家商店,它们的坐标分别为 A1~AN。

现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。

为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。

输入格式

第一行输入整数N。

第二行N个整数A1~AN。

输出格式

输出一个整数,表示距离之和的最小值。

数据范围

1≤N≤100000,
0≤Ai≤40000

输入样例

4
6 2 9 1

输出样例

12

题目分析

这是一道非常基础的算法题,要求一个货仓到每家商店的最短距离,我的思路如下:

1. 我们要找一个仓库,他们在一条路线上

2. 如果是二维的,我们就要一个一个进行判断计算,因为他要求所有的最短距离。但是这道题是一维,所以首先需要求出货仓的坐标

3. 不难分析,当货仓处于所有商店最中间的位置时,到每家商户的距离将会最近,即货仓处于的位置应该是商店坐标的中位数。

假设区间[a,b]的距离;是n那么如果货仓x选在区间[a,b]的任一位置的话,s=n;如果选在区间[a,b]之外的话,s>n。 因此货仓应选在两个点之间,推广到n个商店的情况的话,货仓应该选在最中间的两个点之间,此时的s-定是最小的(可以用反证法证明)。当商店个数是奇数时,中位数只有一个; 当个数是偶数时,中位数有两个,此时可以取两个中位数的平均值,或是直接取整**

4. 确定了货仓的坐标之后,就可以通过将货仓的坐标和每个商店的坐标相减取绝对值再加和,得到货仓到每家商店的最短距离

源代码

 1 # import numpy as np
2
3 n = int(input())
4 # 两种输入方式
5 # nums = list(map(int, input().split()))
6 arr = input("")
7 nums = [int(i) for i in arr.split()]
8
9 # 对输入的数组进行排序
10 nums.sort()
11
12 # 两种求中位数方式
13 address = nums[n >> 1]
14 # address = np.median(nums)
15
16 res = 0
17 for num in nums:
18 res += abs(num - address)
19 print(res)

注意问题

1.  一维数组的输入方式:

nums = list(map(int, input().split()))

或者是:

arr = input("")
nums = [int(i) for i in arr.split()]

2. 求中位数的方式:

① 可以通过导入numpy包,引用其中的median()函数直接求得中位数。

import numpy as np

nums = [6, 5, 8, 2]
address = np.median(nums)

② 也可以通过移位运算符: >> ,移位运算符针对二进制数进行左移或右移,即移动的单位是二的幂次方。假设 n = 8,其二进制为 0000 1000 ,则 n >> 1为 n 向右移2^1,即 0000 0100,此时得到的结果是4,可以直接取得中位数。

address = nums[n >> 1]

1.9 货仓选址问题——Python的更多相关文章

  1. yzoj1657货仓选址 题解

    题面: 在一条数轴上有N家商店,它们的坐标分别为 A[1]~A[N].现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品.为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的 ...

  2. AcWing 104. 货仓选址

    #include <iostream> #include <algorithm> using namespace std; ; int n; int q[N]; int mai ...

  3. [POJ1723]SOLDIERS(中位数)

    题意 给出n个点的坐标,它们只能往上.下.左.右一格一格地移动,求使其移动至水平线上的最小步数. 思路 转载 先易后难,对于纵向的问题,我们推个公式,,这个很容易看出是货仓选址问题,k取y[i]的中位 ...

  4. poj1723 SOLDIERS

    soldiers真乃神题也! 行列显然可以分开处理. 行好办,显然就是一个货仓选址问题,取中位数即可. 列呢?? ?????? 因为懒得推式子,用不了二分,我决定使用枚举大法!一算复杂度O(n^2), ...

  5. [ZJOI2015]幻想乡战略游戏——动态点分治

    [ZJOI2015]幻想乡战略游戏 带修改下,边点都带权的重心 随着变动的过程中,一些子树内的点经过会经过一些公共边.考虑能不能对这样的子树一起统计. 把树上贡献分块. 考虑点分治算法 不妨先把题目简 ...

  6. CF1030F Putting Boxes Together

    昨晚的比赛题.(像我这种蒟蒻只能打打div2) 题意 给你$n$个物品,每一个物品$i$,有一个权值$w_i$和一个位置$a_i$,定义移动一个物品$i$到位置$t$的代价为$w_i * \left ...

  7. 洛谷CF1030F Putting Boxes Together(树状数组)

    题意: 现在有n个物品,第i个物品他的位置在a[i],他的重量为w[i].每一个物品移动一步的代价为他的w[i].目前有2种操作: 1. x y 将第x的物品的重量改为y 2.l r 将编号在 [ l ...

  8. bzoj3032 七夕祭题解

    题面 TYVJ七夕祭和11区的夏祭的形式很像.矩形的祭典会场由N排M列共计N×M个摊点组成.虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧.苹果糖.棉花糖.射的屋--什么的.Vani ...

  9. E1.Send Boxes to Alice(Easy Version)//中位数

    发送盒子给Alice(简单版本) 题意:准备n个盒子放巧克力,从1到n编号,初始的时候,第i个盒子有ai个巧克力. Bob是一个聪明的家伙,他不会送n个空盒子给Alice,换句话说,每个盒子里面都有巧 ...

随机推荐

  1. 15、修改sqldeveloper的JDK路径

    15.1.说明: 1.第一次使用Oracle SQL Developer时会提示选择JDK路径(只会在第一次使用时提示), 如果选择了高版本的JDK(1.8)路径,可能会出现了如下两种情况: (1)s ...

  2. 同步工具——Exchanger

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 本文是转载文章,原文请见这里 一.Exchanger简介 ...

  3. Leetcode No.122 Best Time to Buy and Sell Stock II Easy(c++实现)

    1. 题目 1.1 英文题目 You are given an array prices where prices[i] is the price of a given stock on the it ...

  4. Flask(11)- 操作 Cookie

    前言 Cookie 详解:https://www.cnblogs.com/poloyy/p/12513247.html 这一节来瞧一瞧如何用 Flask 操作 Cookie 接下来就是 实战栗子!!! ...

  5. Linux | 文件编辑命令

    cat cat 命令是是一次性显示文件的所有内容 cat 是 concatenate 的缩写,表示:连接/串联 cat 文件名 可以看到,cat 命令是一次性显示出所有的文件内容,这就导致了,有的文件 ...

  6. 5000字2021最新Python基础知识第一阶段:数据类型

    1 编程规范 注释 python注释也有自己的规范,在文章中会介绍到.注释可以起到一个备注的作用,团队合作的时候,个人编写的代码经常会被多人调用,为了让别人能更容易理解代码的通途,使用注释是非常有效的 ...

  7. yoyogo v1.7.6 增强程序优雅退出和K8s Readiness检查

    YoyoGo (Go语言框架)一个简单.轻量.快速.基于依赖注入的微服务框架( web .grpc ),支持Nacos/Consoul/Etcd/Eureka/k8s /Apollo等 . 本次更新增 ...

  8. clickhouse分布式集群

    一.环境准备: 主机 系统 应用 ip ckh-01 centos 8 jdk,zookeeper,clickhouse 192.168.205.190 ckh-02 centos 8 jdk,zoo ...

  9. Spring RestTemplate 之中文乱码

    由于RestTemplate的默认构造方法初始化的StringHttpMessageConverter的默认字符集是ISO-8859-1,所以导致RestTemplate请求的响应内容会出现中文乱码. ...

  10. 单细胞分析实录(19): 基于CellPhoneDB的细胞通讯分析及可视化 (下篇)

    在上一篇帖子中,我介绍了CellPhoneDB的原理.实际操作,以及一些值得注意的地方.这一篇继续细胞通讯分析的可视化. 公众号后台回复20210723获取本次演示的测试数据,以及主要的可视化代码. ...