Weighted Median
Time Limit: 2000MS Memory limit: 65536K
题目描述
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
输入
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.
来源
2014年山东省第五届ACM大学生程序设计竞赛
题意:
输入两组数xi、wi;其中wi为xi的权值;求满足题中所给条件的xk;
比如示例,S=/2=50,x数组中满足xi<20的有5,10,10,15,5,和为45,小于S,xi>20的有35,<=S;故xk为20;
思路:
将两组数用结构体存储,然后对x数组排序,从头开始累加wi,直到和大于S/2,这时对应的x的值便是xk。。。
以下AC代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Node{
int x,w;
}N[10000005];
int cmp(Node a,Node b)
{
return a.x<b.x;
}
int main()
{
int n;
int i,j;
double s1;
double s;
while(~scanf("%d",&n))
{
s=0.;
s1=0.;
for(i=0;i<n;i++)
{
scanf("%d",&N[i].x);
}
for(i=0;i<n;i++)
{
scanf("%d",&N[i].w);
s+=N[i].w;
}
s/=2;
sort(N,N+n,cmp);
for(i=0;i<n;i++)
{
s1+=N[i].w;
if(s1>s)
{
printf("%d\n",N[i].x);
break;
}
}
}
return 0;
}