您的位置:首页 > 编程语言 > C语言/C++

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

2016-04-21 21:04 405 查看

Weighted Median

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 


Can you compute the weighted median in O(n) worst-case?
 

输入

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大学生程序设计竞赛

题目意思:

给一些数x和它们对应的权值w,按照如图所示公式,s是所有权值w的总和。

求一个xk,使得满足前两个公式。

解题思路:

用结构体保存元素值和权值,先升序排列,累计xk之前的权值和,直到该权值大于s。

/*
* Copyright (c) 2016, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:s.cpp
* 作    者:单昕昕
* 完成日期:2016年4月20日
* 版 本 号:v1.0
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=100000010;
struct Node
{
int x,w;
} node
;

int cmp(Node a,Node b)//结构体排序
{
return a.x<b.x;
}

int main()
{
int n;
while(~scanf("%d",&n))
{
int i;
double sum=0;//注意用double
for(i=0; i<n; i++)
scanf("%d",&node[i].x);
for(i=0; i<n; i++)
{
scanf("%d",&node[i].w);
sum+=node[i].w;
}
sum/=2.0;
double s=0;
sort(node,node+n,cmp);//升序
for(i=0; i<n; ++i)
{
s+=node[i].w;
if(s>sum)
{
printf("%d\n",node[i].x);
break;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息