Problem 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
![](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?
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.
Example Input
7 10 35 5 10 15 5 20 10 35 5 10 15 5 20
Example 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.
![](https://i-blog.csdnimg.cn/blog_migrate/6972f910932b4c3a1d3235944be8a258.png)
题意:给你xi、wi,找的符合满足上面式子的sk;
思路:就是一个结构体排序,然后从前往后加,大于就输出;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <stack>
#define LL long long
#define INF 0x7fffffff
#define MAX 10000010
#define PI 3.1415926535897932
#define E 2.718281828459045
using namespace std;
struct edge
{
int x,w;
};
bool cmp(edge X,edge Y)
{
return X.x<Y.x;
}
edge G[MAX];
double sum;
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(int i=0; i<n; i++)
{
scanf("%d",&G[i].x);
}
for(int i=0; i<n; i++)
{
scanf("%d",&G[i].w);
sum+=G[i].w;
}
sum=sum/2.0;
sort(G,G+n,cmp);
double ss=0;
for(int i=0; i<n; i++)
{
ss+=G[i].w;
if(ss>=sum)
{
printf("%d\n",G[i].x);
break;
}
}
}
return 0;
}