加权中位数(快排)

题目:对于具有正整数权重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,当初没考虑这么多,现在写博客的时候发现了这个问题,这个也是个人的一些见解,大家怎么看随大家了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值