带权中位数

话说在3085年,外星人打算来入侵地球,这个消息被我国的情报部门秘密截获,于是便打算联系世界各个国家,一
起研究商量对策。由于每个国家所需派的技术员人数不同,所以目前无法决定到底要在哪个国家设置个研究所进行
研究,幸运的是所有国家都在一条直线上,现在知道每个国家与我国的距离和该国的研究员人数。请你为他们决定
一下到底在那个国家建立研究所可以使所有研究员集中到该国的费用最小。

Input

输入文件每一行描述一个国家的信息。
首先是该国派出的技术员人数,紧跟着的是这个城市相对于我国的距离,最后是国家的名称。
国家数不大于5000

Output

输出文件只需要一行,即研究所设定的国家名称。

Sample Input

7 9289 JAPAN
5 8523 AMERICA
3 5184 CHINA
8 2213 VIJOS
10 0 DDS

Sample Output

VIJOS


sol:本题每个国家增加了人数,即给每个点分配了权值,这时我们就不能选点的中位数,而要选各个点的权值和的中位数,即带权中位数。
 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn = 5010;
 6 struct Country
 7 {
 8   double p, dis;
 9   string name;
10   bool operator < (const Country& a) const
11   {
12     return dis < a.dis;
13   }
14 }C[maxn];
15 int n = 0;double sum=0,ans=0;
16 int main()
17 {
18   while(cin >> C[n].p >> C[n].dis >> C[n].name)
19   {
20       sum+=C[n].p;//求出各个国家的人数和
21       n++;
22   }   
23   sum=sum/2+1; //计算后的sum为带权中位数
24   sort(C, C + n);//按距离从小到大排序
25   for(int i=0;i<n;i++)//在排序后的国家中找第一个大于等于sum的,该国家即为答案
26     {
27         ans+=C[i].p;
28         if (ans>=sum) 
29         {
30             cout<<C[i].name;
31             return 0;
32         }
33     }
34 }
原文地址:https://www.cnblogs.com/cutepota/p/12126278.html