Description
For n elements x1, x2, ..., xn with positive integer weights w1, w2, ..., wn. The weighted median is the element xk satisfying
and
, S indicates
![](http://acm.sdibt.edu.cn/vjudge/ojFiles/sdut/image/2886_1.png)
![](http://acm.sdibt.edu.cn/vjudge/ojFiles/sdut/image/2886_2.png)
![](http://acm.sdibt.edu.cn/vjudge/ojFiles/sdut/image/2886_3.png)
Can you compute the weighted median in O(n) worst-case?
Input
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).
Output
One line for each case, print a single integer number— the weighted median of the sequence.
Sample Input
7 10 35 5 10 15 5 20 10 35 5 10 15 5 20
Sample Output
20
Hint
The S which indicates the sum of all weights may be exceed a 32-bit integer. If S is 5,
equals 2.5.
![](http://acm.sdibt.edu.cn/vjudge/ojFiles/sdut/image/2886_4.png)
题解:每个数据对应一个权重,从头加直到到达总值的1/2。就是先算总值,在排序相加,另其达到总值的1/2,不用专门找xk.
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct sum
{
long long int x;
long long int y;
} a[1111111];
bool cmp(struct sum p,struct sum q)
{
return p.x<q.x;
}
int main()
{
long long int n,i;
while(~scanf("%lld",&n))
{
for(i=0; i<n; i++)
{
scanf("%lld",&a[i].x);
}
long long int s=0;
for(i=0; i<n; i++)
{
scanf("%lld",&a[i].y);
s+=a[i].y;
}
sort(a,a+n,cmp);
double ss=0;
double k;
k=s/2.0;
for(i=0; i<n; i++)
{
ss+=a[i].y;
if(ss>k)
break;
}
cout<<a[i].x<<endl;
}
return 0;
}