0.5 排序 中位数例题,均分纸牌

中位数也是有一些奇特的性质。
直接讲题吧。
本文章是记录关于视频课程的一些思考,便于以后复习,为大家提供参考

货仓问题

题目描述

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

思路

首先提高效率就是在坐标上任意选取一个点,使得其他货仓到达该点距离和为最小,首先这个点肯定在货仓中间。那么具体是哪个点。
首先将货仓排序得到一串递增序列B[n] ,任取数轴上一点k,使得
|B[1] -k|+|B[2] -k|+……+|B[n] -k|距离和最小。
一点简单的分析知道在中位数。下面是证明。

如K为序列中位数
n为奇数,那么k左右两边货仓数量相同,那么k在相邻两家货仓中间移动时,与所有货仓的距离和不会发生改变。当超出边界,使得左右货仓不相同时,距离开始单调增大。

n为偶数,k为中位数,不管是中间左边还是右边,当在这两个点中间移动时,与所有货仓的距离和不会发生改变。当超出边界,距离开始单调增大。
可以证明,中位数能够使得|B[1] -k|+|B[2] -k|+……+|B[n] -k|最小。

这道题很容易解决,接下来看均分纸牌问题。

均分纸牌问题

题目描述

图片很草率,直接截屏了

思路

这道题其实很难想到,也是听了闫大佬的分析才理清了思路
设纸牌总数为T,首先只有当T/M为正整数,该题才有解,这很容易想到。
那么最后大家手里的纸牌数也一定是T/M。
那么第一个人C[1]张牌
当C[1]>T/M
他需要分出C[1]-T/M张牌给第二个人。
当C[1] 他需要从第二个人拿到T/M-C[1]张牌。
其实也就是分出C[1]-T/M张牌给第二个人。
如此分析第二个人 第二个人手里的纸牌数一定是C[2]+(C[1]-T/M)
C[2]+C[1]-T/M
最后一定也是T/M张牌。
那一定也要分出C[2]+C[1]-T/M*2张牌
照此分析一直到第M个人
总交换牌数目为 ()
其中S[i]为C[i]的前缀和 ,由于最终卡牌数目相等,只考虑交换量,那我们让最终结果为0,其实也没有影响,所以我们让A[i]=C[i]-T/M
最后的交换量其实就是() 这里的S[i]为A[i]的前缀和.
也就是前缀和的和。

环形纸牌均分

下面我们考虑环形纸牌均分,也就是,本来是一条线,现在我们让所有人围城一个圈进行纸牌均分。像下面这样



我们任意标注方向,可以发现,我们其实可以控制其他所有箭头的量使得某箭头消失。例如让1号箭头消失,我们只要让2号箭头传的量变少,3号变少,4号变多,5号变少,6号变多,7号变多。
举其他例子也是一样,虽然没有详细论证,但是多尝试几次我们还是能得出经验结论,就是我们能够去掉一个箭头使得这个环转化为链。
那么下面我们就是考虑去掉哪一个箭头


灵魂画家别介意

我们考虑每个人纸牌数目 A[i] 与前缀和S[i]
如果在M和1号之间断开,从第一个人到最后一个人的纸牌数和前缀和为
A[1] S[1]
A[2] S[2]
……
A[M] S[M]
如果在第K个人之后断开,从第一个人到最后一个人的纸牌数和前缀和为
A[k+1] S[k+1]-S[k]
A[k+2] S[k+2]-S[k]
……
A[M] S[M]-S[k]
A[1] S[M]-S[k]+S[1]
A[2] S[M]-S[k]+S[2]
……
A[k] S[M]-S[k]+S[k]
这里要注意 S[M]是等于0的 所以
式子成为求 min{|S[1]-S[k]|+|S[2]-S[k]|+……+|S[M]-S[k]|} k>=1&&k 观察
A[1] S[1]
A[2] S[2]
……
A[M] S[M]
发现其实后面都加上S[M]后也是成成立的,因为S[M]为0,所以
min{|S[1]-S[k]|+|S[2]-S[k]|+……+|S[M]-S[k]|} k>=1&&k<=M
等于号成立
观察这个式子,是不是很熟悉,其实就是货仓选址问题,于是求出前缀和,找中位数即可。

参考视频
算法进阶指南0.5排序

你可能感兴趣的:(0.5 排序 中位数例题,均分纸牌)