1.9 货仓选址问题——Python
题目描述
在一条数轴上有 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的更多相关文章
- yzoj1657货仓选址 题解
题面: 在一条数轴上有N家商店,它们的坐标分别为 A[1]~A[N].现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品.为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的 ...
- AcWing 104. 货仓选址
#include <iostream> #include <algorithm> using namespace std; ; int n; int q[N]; int mai ...
- [POJ1723]SOLDIERS(中位数)
题意 给出n个点的坐标,它们只能往上.下.左.右一格一格地移动,求使其移动至水平线上的最小步数. 思路 转载 先易后难,对于纵向的问题,我们推个公式,,这个很容易看出是货仓选址问题,k取y[i]的中位 ...
- poj1723 SOLDIERS
soldiers真乃神题也! 行列显然可以分开处理. 行好办,显然就是一个货仓选址问题,取中位数即可. 列呢?? ?????? 因为懒得推式子,用不了二分,我决定使用枚举大法!一算复杂度O(n^2), ...
- [ZJOI2015]幻想乡战略游戏——动态点分治
[ZJOI2015]幻想乡战略游戏 带修改下,边点都带权的重心 随着变动的过程中,一些子树内的点经过会经过一些公共边.考虑能不能对这样的子树一起统计. 把树上贡献分块. 考虑点分治算法 不妨先把题目简 ...
- CF1030F Putting Boxes Together
昨晚的比赛题.(像我这种蒟蒻只能打打div2) 题意 给你$n$个物品,每一个物品$i$,有一个权值$w_i$和一个位置$a_i$,定义移动一个物品$i$到位置$t$的代价为$w_i * \left ...
- 洛谷CF1030F Putting Boxes Together(树状数组)
题意: 现在有n个物品,第i个物品他的位置在a[i],他的重量为w[i].每一个物品移动一步的代价为他的w[i].目前有2种操作: 1. x y 将第x的物品的重量改为y 2.l r 将编号在 [ l ...
- bzoj3032 七夕祭题解
题面 TYVJ七夕祭和11区的夏祭的形式很像.矩形的祭典会场由N排M列共计N×M个摊点组成.虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧.苹果糖.棉花糖.射的屋--什么的.Vani ...
- E1.Send Boxes to Alice(Easy Version)//中位数
发送盒子给Alice(简单版本) 题意:准备n个盒子放巧克力,从1到n编号,初始的时候,第i个盒子有ai个巧克力. Bob是一个聪明的家伙,他不会送n个空盒子给Alice,换句话说,每个盒子里面都有巧 ...
随机推荐
- 连接mysql数据库实现增删改查(一)
在python中我们通过pymysql来连接数据库,具体实现如下 ''' 连接mysql数据库 此类进行封装了一些基础的操作数据库方法 ''' import pymysql from Homework ...
- java_线程创建的三种方式及区别
java中关于线程的创建有三种: (1)通过继承Thread类创建线程. (2)通过实现Runnable接口创建线程. (3)通过Callable 和 Future 接口创建线程. * * * * * ...
- 常见web安全隐患及解决方案(转)
Abstract 有关于WEB服务以及web应用的一些安全隐患总结资料. 1. 常见web安全隐患 1.1. 完全信赖用户提交内容 开发人员决不能相信一个来自外部的数据.不管它来自用户 ...
- Java实验项目二——打印某年某月日历
Program:打印万年历(输入年份,月份,输出该月的日历,已知1900年1月1日是星期一), 要 求: (1)编写一个方法判断闰年: (2)编写一个方法判断某年某月有多少天: (3)编写一个方法计算 ...
- XCTF GAME
首先这题有两种解法,一种是使用ida查看伪代码直接写exp跑出flag,另外一种是调试,因为最近在学调试,刚好用于实战上了. 一.查壳 二.32位文件拖入od动态调试 先找到game的主要函数,插件中 ...
- 带实习生学Spring Boot 之 Spring Profiles
大家好,我是指北君. 最近公司新来了一个实习生,挺上进的,天天追着我问问题.指北君开启了带实习生打怪升级之路.吶,今天问了一个关于 Spring Profiles 的问题. 实习生:指北君,你知道 S ...
- varnish配置语言(1)
目录 1. vcl语法 1.1 主体语法 1.2 操作符 1.3 Subroutines 1.4 关键字 2. 内置的Subroutines 2.1 client-side vcl_recv vcl_ ...
- kali中设置共享文件夹
1.在虚拟机设置共享目录 2.查看共享目录命令 root@kali:~# vmware-hgfsclient 3.新建文件夹 root@kali:~# mkdir /mnt/hgfs/ShareDir ...
- 【spring源码系列】之【Bean的初始化】
只要不放弃,希望迟早都会到来! 1. Bean的初始化 如果把bean的生命周期看作一个婴儿诞生过程的,那么创建实例相当于婴儿从母体出来,一丝不挂光秃秃:属性赋值相当于给宝宝的头带帽子,上身穿衣服.下 ...
- 「 题解」NOIP2021模拟赛(2021-07-19)
小兔的话 欢迎大家在评论区留言哦~ D - 矩阵 简单题意 一个 \(i * i\) 的 \(01\) 矩阵,若满足 每一行 和 每一列 都满足 恰好 有 \(2\) 个位置是 \(1\) 时,称为 ...