题目:对于具有正整数权重w1,w2,...,wn的n个元素x1,x2,...,xn。的加权中值是满足元件XK
和
,S表示
你能算出O(n)最坏情况下的加权中位数吗?
input:有几个测试用例。对于每种情况,第一行包含一个整数n(1≤n≤10^ 7) - 序列中的元素数。以下行包含n个整数xi(0≤xi≤10^ 9)。最后一行包含n个整数wi(0 <wi <10 ^ 9)。
output:每种情况一行,打印一个整数 - 序列的加权中位数。
样本输入:
7
10 35 5 10 15 5 20
10 35 5 10 15 5 20
样本输出:
20
题解:用sort的结构体排序,找到后就直接输出,没啥好说的。。
代码实现:
#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N=1e7;
struct bao
{
long long xi,wi;
} s[N];
bool cmp(struct bao p,struct bao q)
{
return p.xi<q.xi;
}
int main()
{
long long n,sum=0,temp=0,i;
while(scanf("%lld",&n)!=EOF)
{
temp=0;
sum=0;
for(i=0; i<n; i++)
scanf("%lld",&s[i].xi);
for(i=0; i<n; i++)
scanf("%lld",&s[i].wi);
sort(s,s+n,cmp); /*结构体排序,按照从小到大排序*/
for(i=0; i<n; i++)
sum+=s[i].wi;
if(sum%2==0)
sum/=2; /*此题当是偶数就是直接除2求中间值就好了,这里有些小问题,下面
说*/
else
sum=(sum/2)+1; /*是奇数应该就是所有权重加起来中间的那一个所以要除完后加一*/
for(i=0; i<n; i++)
if(temp+s[i].wi<sum) /*这里就是找的过程了,因为找到中间的权重已经,所以只要累加
就好了,如果加上的值超过了就不用加了,这个权重对应的数就
是中位数*/
temp+=s[i].wi;
else
{
printf("%lld\n",s[i].xi);
break;
}
}
return 0;
}
注:这里说一说问题
比如说一组数据
5
1 2 3 4 5
2 1 1 1 1
根据我们的程序得到的答案是2,我上网上也看过别人的代码,结论有3也有2的,不过总体3还是多一些,因为你从上面的到加起来其实是个偶数,它的中位数应该是第3位与第4位的和除以2,我认为是应该是2.5,当初的时候没有考虑到这个事情,应该是碰巧后台没有这组数据,结果AC,当初没考虑这么多,现在写博客的时候发现了这个问题,这个也是个人的一些见解,大家怎么看随大家了。
5659

被折叠的 条评论
为什么被折叠?



