Weighted Median
Time Limit: 2000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
For n elements x1, x2, ..., xn with positive integer weights w1, w2, ..., wn. The weighted median is the element xk satisfying
and
, S indicates
![](https://i-blog.csdnimg.cn/blog_migrate/dbf79ad7738b0cafa1cc7b26e57dbb37.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2f58e7c10f38ecc6970e1d9de69075f6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/66d1650e88fff9045d0f08c5d639fb2d.png)
Can you compute the weighted median in O(n) worst-case?
输入
There are several test cases. For each case, the first line contains one integer n(1 ≤ n ≤ 10^7) — the number of elements in the sequence. The following line contains n integer numbers xi (0 ≤ xi ≤ 10^9). The last line contains n integer numbers wi (0 < wi < 10^9).
输出
One line for each case, print a single integer number— the weighted median of the sequence.
示例输入
7 10 35 5 10 15 5 20 10 35 5 10 15 5 20
示例输出
20
提示
The S which indicates the sum of all weights may be exceed a 32-bit integer. If S is 5,
equals 2.5.
![](https://i-blog.csdnimg.cn/blog_migrate/6972f910932b4c3a1d3235944be8a258.png)
来源
2014年山东省第五届ACM大学生程序设计竞赛
示例程序
按照题目要求写就行了
ACcode:
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define maxn 10000010
#define ll long double
using namespace std;
struct N{
int x;
int w;
bool operator<(const N &b)const{return this->x<b.x;}
}my[maxn];
int main(){
int n,ans;
ll sum,tt;
while(~scanf("%d",&n)){
sum=0;
for(int i=1;i<=n;++i)
scanf("%d",&my[i].x);
for(int i=1;i<=n;++i){
scanf("%d",&my[i].w);
sum+=my[i].w;
}
sort(my+1,my+1+n);
tt=my[1].w;
for(int i=1;i<n;++i)
if(tt+my[i+1].w<sum/2)tt+=my[i+1].w;
else {ans=my[i+1].x;break;}
printf("%d\n",ans);
}
return 0;
}