Weighted Median(山东省第五届ACM大学生程序设计竞赛 )

来源:互联网 发布:2015年度网络热词 编辑:程序博客网 时间:2024/05/02 01:03

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 
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

710 35 5 10 15 5 2010 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.


题意:给你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.718281828459045using 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;}


阅读全文
0 0