带权中位数结论及两种解法

有若干个排列在一条直线上的点pi,每个点上有ai个人找出一个人使所有的人移动到这个人的位置上的总距离最小;

对于这道题有个结论:是人数刚刚过半的点就是我们要寻找的点

带权中位数结论及两种解法_第1张图片

证明就如上图:我们假设第Px个点就是我们要寻找的目标点,Px-1及其左边的点都要少走一段长度为len的长度,而对于Px及其右边的点都要多走一段长度为len的长度;

由此我们可以由上从走后一个点进行枚举设q为其枚举的位置我们可以发现在Pq还未刚刚过半的时候我们求的距离是一直在减小的而当Pq过半之后我们求的距离是一直在增大的,呢我们就成功的证明出了带权中位数的结论;

第一种解法是利用了上面的公式而第二种解法则是利用了第一种的思路;

第二种解法:我们可以先暴力算出所有的点到第一个点的距离和,然后根据第一个点来求出他的相邻点的距离;

推导公式如下:dx+1=dx+(Px+1-Px)*(x及其之前的所有人-x+1及其之后的所有人);

这个求x及其之前的所有人可以用前缀和,x+1及其之后的所有人可以用所有人减去x及其之前的人数;

这样我们只用暴力求出所有人到第一个点的距离就可以以此推出之后的每个点,可以实现o(1)的复杂度

你可能感兴趣的:(带权中位数结论,算法)