【资料】带权中位数

带权中位数算法及应用

 

信息学奥赛中有这样一类题:给出若干个排列在一条直线上的点,每个点有一个权值,比如说货物量或者人数等,然后让我们找出使所有点的货物或人集合到一个点的总代价值最小得位置。这类问题实际上就是求带权中位数位置问题。

    一、带权中位数问题

中位数是统计学中的一个名词,把一组数据按大道小顺序排列,处在最中间闻之的那个数就叫做中位数。中位数,将数据分成前后两个部分,用来表示一组数据的“中等水平”。中位数的位置与样本数的奇偶性有关,当样本数为奇数时,中位数为第(n+1)/2个数据;当样本数为偶数时,中位数为第n/2与第n/2+1个数据的算术平均值。所谓带权中位数,就是给定的n个有序的数,每个数都有一个权值d[i](i=1,2,3,….,n)。此时的中位数就不再是第n/2个数了,而是这个数。中位数可以看做是权值为1的带权中位数。

通过证明可以得出,最优位置的选择与距离无关,设最优位置在t,则有t左面的权值和leftsym加上d[t]后大于右面的权值和,而类似的,也有右面的权值和加上d[t]后大于左面的权值和。因此我们要找到的点也就是满足以上条件的点。注意到此时我们的选择已经和具体的位置(坐标)没有关系了,而成为主要考虑因素的仅仅是各点上的权值。

进一步证明会发现,最优位置上的数,就是这个序列中的带权中位数,所以这一类问题,实质上就是带权中位数的问题。

二、带权中位数问题的常见算法:

1、朴素算法:

方法:枚举集合点,计算出当前集合点的代价,从而找出最小的那个代价。时间复杂度:O(n*n)。

2、递推算法:

方法:利用前面的结论和带权中位数的定义,只需要依次扫描即可。

时间复杂度:O(n)

算法实现:

1)  计算总的人数和,初始左边总人数为0;

2)  当前点t从1开始计算

3)  若左边的总人数+当前点的人数<总人数的一半,则转4,否则转5

4)  则把当前点的人数累加到左边总人数和中,当前点后移一位(t=t+1),转3

5)  t点就是我们所求的最优点

6)  计算到t点的总代价和。

  3、分值算法:

方法:二分集合点

时间复杂度:利用已知信息,将时间复杂度降到O(n)。

算法实现:

l=1;r=n;

  while(l<=r)}

     m=(l+r)/2;

     计算m左边和及m右边的和;

     if(leftsum>rightsum) {r=m;d[r]=d[r]+rightsum;}//把右边的集合到m点

     if(leftsum<rightsum){l=m;d[l]=d[l]+leftsum;}//把左边的集合到m点

     if(leftsum==rightsum)  break;

    }

   midplace=m;//m即为中位数的位置

三、带权中位数的应用

1、vijos1225拯救世界之紧急召唤

要从不同的国家要召集不同的人员开会,问开会地点设在哪个国家使得所有人员集中到该地点的费用最小。

输入格式:若干行,每行描述一个国家的信息,首先是该国派出的人数,紧跟着是这个城市相对于我国的距离,最后是国家的名称。

输出格式:输出只一行,即研究人员(开会地点)集中的国家名称。

输入样例:

7 9289 japan

5 8523 america

3 5184 china

8 2213 vijos

10 0 dds

输出样例:

vijos

说明:

30%的数据,国家数不大于100;

60%的数据,国家数不大于500;

100%的数据,国家数不大于5000;

0<人员数<=100,0<=国家相对距离<=2^31-1;国家名称长度<=20.

数据保证有唯一解。

 

解析:

此题,为带权中位数问题。先对国家按距离从小到大排序,然后求出总人数,从第一个国家开始把人数累加起来,当人数大于总人数一半时就退出。此时,所在的国家即为所求。

 

2、vijos1036安装服务器

政府要建立一个大型的服务器中心,为各个城市提供网络服务。每个城市对网络的需求量是不一样的,而需求量越大,对线路的需求也越高,线路的成本也就越高。因此,需要选择合适的地点修建。每个城市用二维整数坐标表示,两个点之间的距离定义为水平距离+垂直距离,即a,b两点间的距离d(a,b)=|xa-xb|+|ya-yb|。对于每个城市,线路的费用为:费用=距离*人口*城市的网络需求程度。总的费用为各个城市的费用的总和。求你找出最适合(总费用最小)安装服务器的整数坐标(一定要在城市上)。

输入格式:

输入第一行有一个正整数n(n<=100000),表示城市的数量。后面的n行每行描述一个城市,每行有四个整数x,y,p,k分别表示城市的坐标,人口数,以及网络需求的程度。(0<x<2^31,p<=600,k<=30)

输出格式:

一行,两个整数x,y,表示最优解的坐标,如果有多个最优解,那么输出x最小的,如果x相同,那么输出y最小的。

输入样例:

5

2 3 5 3

2 1 100 30

2 2 1 1

3 2 7 6

1 1 4 30

输出样例:

2 1

解析:

对n个城市的x和y坐标分别排序,分别求出排序后的横坐标带权中位数和纵坐标带权中位数。

3、depot

有一个公司,在一条街上有n个快餐店,公司决定修k个仓库以满足这些快餐店的原料需求。现在给出n个快餐店的横坐标(他们都在一条直线上),要求修k个仓库,使得所有的快餐店离其最近的仓库距离最近。

公式如下:

 

输入格式:

第一行两个整数n,k,表示有n个快餐厅和要修k个仓库。其中1<=n<=200,1<=k<=30。然后,下面有n行,每行一个整数,表示餐厅的位置。它们都小于等于2*10^5.餐厅的位置按从小到大的顺序输出。

输出格式:

输出一个整数min,表示在n个餐厅修k个仓库使得餐厅到距其最近仓库距离最短。

输入样例:

6 3

5

6

12

19

20

27

输出样例:

8

解析:此题是一道动态规划题目,但是在dp过程中用到了中位数的知识。

Sgu114 ,  pku1723   ,pku1160,   zju1196

转载于:https://www.cnblogs.com/oijzh/articles/2647134.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值