加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

poj 3579 Median 二分查找与lower_bound

发布时间:2020-12-13 20:14:25 所属栏目:PHP教程 来源:网络整理
导读:题意: 给n个数,他们两两之间较大数减去较小数总共有n*(n⑴)/2个数,要求这些数的中位数。 分析: 两次2分,第1次枚举答案,第2次判断该数是不是可能成为中位数。 代码: //poj 3579//sep9#include iostream#include algorithmusing namespace std;const in

题意:

给n个数,他们两两之间较大数减去较小数总共有n*(n⑴)/2个数,要求这些数的中位数。

分析:

两次2分,第1次枚举答案,第2次判断该数是不是可能成为中位数。

代码:

//poj 3579 //sep9 #include <iostream> #include <algorithm> using namespace std; const int maxN=1e5+10; int a[maxN]; int n,m; int test(int x) { int sum=0; for(int i=0;i<n;++i) sum+=lower_bound(a+i,a+n,a[i]+x)-(a+i)⑴; if(sum<=m) return 1; return 0; } int main() { while(scanf("%d",&n)==1){ for(int i=0;i<n;++i) scanf("%d",&a[i]); sort(a,a+n); int l,r,mid,ans; m=n*(n⑴)/2; if(m%2==1) m/=2; else m=m/2⑴; l=0,r=a[n⑴]-a[0]+1;//[) while(l<r){ mid=(l+r)/2; if(test(mid)){ l=mid+1; ans=mid; }else r=mid; } printf("%d ",ans); } return 0; }


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读