山东省第五届ACM省赛题——Weighted Median(模拟)
2016-04-20 14:13
302 查看
题目描述
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
本来看到n是10^7就想着是不是有什么高效的算法,结果一看别人做的才知道可以直接模拟过程,从1到n循环,结果700多MS过了。。。
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
本来看到n是10^7就想着是不是有什么高效的算法,结果一看别人做的才知道可以直接模拟过程,从1到n循环,结果700多MS过了。。。
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #include <stack> #include <map> #include <bitset> #define MAXN 10000010 using namespace std; struct Number { int x,w; }; Number num[MAXN]; bool cmp(Number a,Number b) { return a.x<b.x; } long long sum,first,last,ans; int main() { double S; int n,m,i; while(~scanf("%d",&n)) { sum=0; for(i=1; i<=n; ++i) scanf("%d",&num[i].x); for(i=1; i<=n; ++i) { scanf("%d",&num[i].w); sum+=num[i].w; } sort(num+1,num+1+n,cmp); S=sum*0.5; first=last=0; for(i=1;i<=n-1;++i) { first+=num[i].w; last=sum-first-num[i+1].w; if(first<S&&last<=S) { ans=num[i+1].x; break; } } printf("%lld\n",ans); } return 0; }
相关文章推荐
- Am命令用法
- 使用苹果地图定位地理信息反编码 遇到 Error Domain=kCLErrorDomain Code=8 问题
- linux bash shell中,单引号、 双引号,反引号(``)的区别及各种括号的区别
- Linux shell脚本中父子进程与变量的分析
- Conquering Keokradong && Get the Containers(二分)
- 利用Python如何生成随机密码
- UIDynamicAnimator
- spark sql运行错误
- Android布局RelativeLayout(相对布局)详解
- Visual Studio 调试小技巧
- Jquery Ajax 使用备忘
- 动态生成img的链接
- Django filter符合表示"不等于"
- [改善Java代码]别让null值和空值威胁到变长方法
- OpenERP QWeb模板标签笔记
- 装箱的过程
- 【项目管理和构建】十分钟教程,eclipse配置maven + 创建maven项目(三)
- Arduino可穿戴开发入门教程LilyPad介绍
- awk用法
- A simple IOCP Server/Client Class