For n elements x1, x2, ..., xn with positive integer weights w1, w2, ..., wn. The weighted median is the element xk satisfying
Can you compute the weighted median in O(n) worst-case?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; }