poj3579 二分搜索+二分查找

Median

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 5468   Accepted: 1762

Description

Given N numbers, X1, X2, ... , 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 m = 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 X1, X2, ... , XN, ( Xi ≤ 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题目大意:给你n个数,任意两个数之间的差共有m=(n-1)*n/2种然后让你输出这些数中间的那一个,规则为若m为奇数,中间的那一个为第(m+1)/2小的数,若m为为偶数,中间那个数指的是第m/2小的数。思路分析:看了一下数据范围,如果用最正常最简单的做法,复杂度O(n^2),肯定会超时,因此需要采用高效率的二分算法,因为a[i]-a[j]是取了绝对值的,因此就相当于是大的减小的,因此可以将数组a[n]先sort排序,然后根据差值确定二分范围,我确定的是0~a[n-1]-a[0],然后开始二分搜索,而check函数则主要是统计比a[i]+d小的数有多少个,如果>=(m+1)/2就return true else return false,而在统计的过程中如果用传统的顺序查找肯定也会到致超时,所以应该使用高效率的二分查找,我直接用了upper_bound函数,统计的时候注意upper_bound-a是所有<=a[i]+x的数组元素的个数,应该减去所有<=a[i]的元素(共i+1个)代码:#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;int a[100000+5];int n;int temp;bool check(int x){    int cnt = 0;    for(int i=0; i<n; i++)    {       int t=upper_bound(a,a+n,a[i]+x)-a;//比a[i]+x小的元素的个数       cnt+=(t-i-1);//排除a[i]之前的那些元素,共有i+1;    }    if(cnt>=temp) return true;          else return false;}int main(){    while(scanf("%d",&n)!=EOF)    {         for(int i=0;i<n;i++)            scanf("%d",&a[i]);         sort(a,a+n);         int m=n*(n-1)/2;         temp=(m+1)/2;         int l=0,r=a[n-1]-a[0];         int ans;         while(l<=r)//二分搜索         {             int mid=(l+r)>>1;             if(check(mid))              ans=mid,r=mid-1;             else l=mid+1;         }         printf("%d\n",ans);    }    return 0;}
时间: 2024-12-21 19:42:08

poj3579 二分搜索+二分查找的相关文章

二分查找算法java实现

今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法.请注意这种算法是建立在有序数组基础上的. 2.算法思想. ①搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: ②如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间

关于二分查找分

折半搜索,也称二分查找算法.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: B 如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较. C 如果在某一步骤数组为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半.

[数据结构] 二分查找与变种二分查找

1.二分查找 二分搜索(binary search),也称折半搜索(half-interval search).对数搜索(logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法.搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半. 除直接在一个数组

2. C#数据结构与算法 -- 查找算法(顺序查找,哈希查找,二分查找(折半),索引,二叉)

1. 顺序查找算法 ===================================================== 算法思想简单描述: 最突出的查找类型就是从记录集的开始处顺次遍历每条记录,直到找到所要的记录或者是 到达数据集的末尾.这就是所谓的顺序查找.顺序查找(也被称为线性查找)是非常容易实现 的.从数组的起始处开始,把每个访问到的数组元素依次和所要查找的数值进行比较.如果找 到匹配的数据项,就结束查找操作.如果遍历到数组的末尾仍没有产生匹配,那么就说明此数 值不在数组内. ==

算法复习笔记:二分查找

在计算机科学中,折半搜索(英语:half-interval search),也称二分查找算法(binary search).二分搜索法.二分搜索.二分探索,是一种在有序数组中查找某一特定元素的搜索算法.搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半. 实现: int bin

uva 10763 Foreign Exchange(排序+二分查找)

这道题是我第一次算出来应该用什么复杂度写的题,或许是这一章刚介绍过,500000的数据必须用nlogn,所以我就 想到了二分,它的复杂度是logn,再对n个数据进行遍历,正好是nlogn,前两次TLE了,然后我就对我的做法没信心 了...看到一篇博客上说就应该这种方法,然后我就坚定的改自己的算法去了,哈哈,专注度没有达到五颗星,最多 三颗... 思路: 我用的是结构体保存的,先对每一对序列排序,然后对第二个元素在第一个元素中二分搜索,用到了 lower_bound,upper_bound,注释里

详解二分查找算法

我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky... 这句话可以这样理解:思路很简单,细节是魔鬼. 本文就来探究几个最常用的二分查找场景:寻找一个数.寻找左侧边界.寻找右侧

面试现场:手撕二分查找算法

算法概述 二分搜索,也称折半搜索.对数搜索,是一种在有序数组中查找某一特定元素的搜索算法. 搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半. 二分搜索在情况下的复杂度是对数时间,进行 O(log n)次比较操作(n在此处是数组的元素数量, O是大O记号, log 是对数).

『嗨威说』算法设计与分析 - 算法第二章上机实践报告(二分查找 / 改写二分搜索算法 / 两个有序序列的中位数)

本文索引目录: 一.PTA实验报告题1 : 二分查找 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 改写二分搜索算法 2.1 实践题目 2.2 问题描述 2.3 算法描述 2.4 算法时间及空间复杂度分析 三.PTA实验报告题3 : 两个有序序列的中位数 3.1 实践题目 3.2 问题描述 3.3 算法描述 3.4 算法时间及空间复杂度分析 四.实验心得体会(实践收获及疑惑) 一.PTA实验报告题1 : 二分查找 1.1 实践