题目描述

在一条数轴上有 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. vue 快速入门 系列 —— vue loader 下

    其他章节请看: vue 快速入门 系列 vue loader 下 CSS Modules CSS Modules 是一个流行的,用于模块化和组合 CSS 的系统.vue-loader 提供了与 CSS ...

  2. 2018-10-14普及模拟赛」Hash 键值 (hash)

    今天,带大家看一看一道思维题... Hash 键值 (hash) 题目描述 Marser沉迷hash无法自拔,然而他发现自己记不住hash键值了-- Marser使用的hash函数是一个单纯的取模运算 ...

  3. ps 合并两张图片

    1.ps 打开第一张图片,2.打开另一张图片为图层.3.选中图层,创建蒙版: 4.点击蒙版+按Alt键,打开蒙版:5.打开蒙版后选中渐变工具,途中黑色为不显示区域,(注意渐变模式要改为正常):6.调整 ...

  4. css角标

    HTML: <div class='card-wrap'> <div class='news1'> <div class='ribbon'> <div cla ...

  5. consul 多节点/单节点集群搭建

    三节点配置 下载安装包 mkdir /data/consul mkdir /data/consul/data curl -SLO https://github.com/consul/1.9.5/con ...

  6. tcp三次握手四次挥手----转

    序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后,就给每一个报文段指派一个序号:序列号seq就是这个报文 ...

  7. 2021/2/5 关于new的一个教训

    千万不要在类构造函数的初始化里new任何东西,这会导致析构函数delete一个野指针!构造函数一定要把所有的指针初始化为nullptr! 以下代码会报错(堆内存崩溃): Integer::Intege ...

  8. 重新梳理调度器——GMP 调度模型

    调度器--GMP 调度模型 Goroutine 调度器,它是负责在工作线程上分发准备运行的 goroutines. 首先在讲 GMP 调度模型之前,我们先了解为什么会有这个模型,之前的调度模型是什么样 ...

  9. 一、Java预科学习

    1.1.什么是计算机 计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能.是能够按照程序运行,自动.高速处理海量数据的现 ...

  10. Java 使用新方法打印Word文档

    前言 我曾写过一篇文章,它主要介绍了如何通过物理打印机和虚拟打印机来打印Word文档.今天这篇教程将介绍一种新的方法来实现对Word文档的打印. 此次使用到的类库仍然是Spire.Doc for Ja ...