Median POJ - 3579 (二分)

Given N numbers, X1X2, ... , XN, let us calculate the difference of every pair of numbers: ∣Xi - Xj∣ (1 ≤ i  j  N). We can get C(N,2) differences through this work, and now your task is to find the median of the differences as quickly as you can!

Note in this problem, the median is defined as the (m/2)-th  smallest number if m,the amount of the differences, is even. For example, you have to find the third smallest one in the case of = 6.

Input

The input consists of several test cases.
In each test case, N will be given in the first line. Then N numbers are given, representing X1X2, ... , XN, ( X≤ 1,000,000,000  3 ≤ N ≤ 1,00,000 )

Output

For each test case, output the median in a separate line.

Sample Input
4
1 3 2 4
3
1 10 2
Sample Output
1
8

题意:任意两个数的差值的绝对值,让你找出这些值中的中位数 ,如果数有6个那么你找出第3大的

显然 有一个值满足大于等于这个值的个数大于等于k个(比如总共6个差值,那么k为3      3个差值,k为 2),如果这个值-1 就小于k个 那么说明这个值是中位数

#include<stdio.h>
#include<string.h>
#include<map>
#include<vector>
#include<iostream>
#include<algorithm>
#include<queue>
#include<deque>
#include<math.h>
#define ll long long
const ll inf=1e10;
using namespace std;
ll a[1000005];
ll k,n;
int aa(ll x)
{
   ll uu=0;
   for(ll i=0;i<n-1;i++)
   {
       ll o=upper_bound(a+i+1,a+n,x+a[i])-a; //因为排过序 ,所以 x+a[i]就是 差值+a[i] ,可以找到有几个差值在x以下
       uu+=o-i-1;
       if(uu>=k) return 1;//如果大于等于k个  返回 1
   }
   return 0;
}
int main()
{
  while(~scanf("%lld",&n))
  {
      k=n*(n-1)/2;
      k=(k+1)/2;
      for(int i=0;i<n;i++)
        scanf("%lld",&a[i]);
      sort(a,a+n);
      ll r=inf,l=0,mid,ans;//二分中位数的值
      while(l<=r)
      {
          mid=(l+r)/2;
//          printf("%lld\n",mid);
          if(aa(mid))
          {
              ans=mid;
              r=mid-1;
          }
          else
            l=mid+1;
      }
      printf("%lld\n",ans);
  }
}




Sen-Median趋势分析方法是一种用于描述和分析时间序列数据的统计工具。它通过将数据按照位置进行排序,确定数据的中间位置,将中间位置的数据作为时间序列的趋势模型。 Sen-Median趋势分析方法主要分为以下几个步骤:首先,将时间序列数据按照时间顺序进行排序。然后,计算出各个时间点数据的斜率值,即通过计算两个数据值的差值来衡量数据的变化趋势。接下来,找到数据斜率值的中位数,作为代表数据整体趋势的中间趋势。最后,根据中间趋势值来绘制趋势线,以展示数据的整体趋势。 Sen-Median趋势分析方法具有以下几个特点:首先,它能够减轻极端值对趋势分析结果的影响,使得趋势模型更加平滑和稳定。其次,这种方法不依赖于分布假设,可以适用于不同类型的数据。第三,该方法计算简单,不需要对数据进行复杂的数学计算,比较易于理解和使用。 Sen-Median趋势分析方法在实际应用中具有广泛的应用。例如,在金融领域,可以使用该方法来分析股票价格的趋势,帮助投资者做出决策。在气象学中,可以利用该方法来研究气温变化的趋势,以预测天气情况。此外,在经济学、环境科学等领域,Sen-Median趋势分析方法也有着广泛的应用。 总之,Sen-Median趋势分析方法是一种用于揭示时间序列数据趋势的统计分析工具,它的特点是稳定、简单易懂,广泛应用于各个领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值