二分查找下界 下界

#include<stdio.h>

#include<algorithm>

using namespace std;

int a[10000];

int Serch(int x,int y,int v)//二分查找下界当找不到的时候返回的是第一个大于v的下标,因为当出现a[x]小于v的时候,a[y]大于v的时候,mid=x=(y+x)/2,程序会执行else,所以返回的时候就是y的值,注意越界;

{

int mid;

while(x<y)

{

mid=(x+y)/2;

if(a[mid]>=v)

y=mid;

else

x=mid+1;

}

return x;

}

int main()

{

int n,i,m,b;

while(scanf("%d",&n)!=EOF)

{

for(i=0;i<n;i++)

scanf("%d",&a[i]);

sort(a,a+n);

scanf("%d",&m);

for(i=0;i<m;i++)

{

scanf("%d",&b);

int x=Serch(0,n,b);

printf("%d %d\n",x,a[x]);

}

}

return 0;

}

#include<stdio.h>

#include<algorithm>

using namespace std;

int a[10000];

int Serch(int x,int y,int v)//二分查找上界当找不到的时候返回的是第一个大于v的值,因为当出现a[x]小于v的时候,a[y]大于v的时候,mid=y=(y+x+1)/2,程序会执行else,所以返回的时候就是y的值,注意越界;

{

int mid,k=0;

while(x<y)

{

mid=(x+y+1)/2;//注意这个求中间值

if(a[mid]>v)

y=mid-1;

else

x=mid;

}

return x;

}

int main()

{

int n,i,m,b;

while(scanf("%d",&n)!=EOF)

{

for(i=0;i<n;i++)

scanf("%d",&a[i]);

sort(a,a+n);

for(i=0;i<n;i++)

printf("%d ",a[i]);

puts("");

scanf("%d",&m);

for(i=0;i<m;i++)

{

scanf("%d",&b);

int x=Serch(0,n,b);

printf("%d %d\n",x,a[x]);

}

}

return 0;

}

调用STL

#include<stdio.h>

#include<iostream>

#include<algorithm>

using namespace std;

int v[10000];

int main()

{

int n,m,a,b,i;

while(scanf("%d%d",&n,&m)!=EOF)

{

for(i=0;i<n;i++)

scanf("%d",&v[i]);

sort(v,v+n);

for(i=0;i<m;i++)

{

scanf("%d%d",&a,&b);

cout<<upper_bound(v,v+n,b)<< endl;//返回的是上界地址

cout <<lower_bound(v,v+n,a)<< endl;//返回的是下界地址

}

}

return 0;

}

时间: 2024-08-05 15:22:16

二分查找下界 下界的相关文章

关于二分查找及其上下界问题的一些思考

个人认为在编程的时候,我的代码能力应该是到位的,但是昨天参加的某公司笔试彻底把这个想法给终结了,才意识到自己是多么的弱.其中印象最深刻的是一道关于二分查找上下界的问题.当时洋洋得意,STL 分分钟搞定,结果到了面试的时候他要我自己重新实现一下.这个时候就拙计了,拿着笔的我是写了改改了写,最后勉强算是完成. 今天反思一下,决定自己再把二分查找重新实现一下.也作为给自己的一个警醒,不要总以为自己能力有多高,总有一天会被打脸的. 一.二分查找思想(参照<算法竞赛入门经典>,感谢刘老师). 在有序表中

ACM:二分查找,以及利用二分法来找上下界

(一)二分的模版: int binary_search(int *array, int length, int key) { int start = 0, end = length - 1; while(end >= start) { int middle = start + (end - start) / 2; int tmp = array[middle]; if(tmp < key) start = middle + 1; else if (tmp > key) end = mid

poj 3518 Prime Gap 二分查找下界和素数筛法

/* 题意:输入有多组数据,每组数据一个n,如果n是素数,输出0否则输出离n最近的两个素数的积,第100000个素数是1299709,所有的素数都在这个范围内 思路:素数筛法加二分查找下界 */ #include<stdio.h> int a[1299720],pri[100005]; int Serch(int v)//二分查找下界 { int mid,x=0,y=100001; while(x<y) { mid=(y+x)/2; if(pri[mid]>=v) y=mid; e

【bzoj2406】矩阵 二分+有上下界可行流

题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 题解 二分+有上下界可行流 题目一眼二分,问题转化为判断是否存在一种填数方式满足行之和的差与列之和的差都不超过mid. 然后原来的和式就可以转化为$|\sum\limits_{i=1}^na_i-\sum\limits_{i=1}^nb_i|\le mid$,即可得到$\sum\limits_{i

二分查找

递归版(在区间[x, y)中找v的位置) 1 //递归版二分查找 2 int bsearch(int * A, int x, int y, int v) 3 { 4 5 if(v<a[x] || v>a[y-1]) return -1; 6 int m = x + (y-x)/2; //此处能不能用int m = (x+y)/2,需要仔细考虑(暂时想不到原因) 7 if(A[m]==v) return m; 8 else if(A[m]>v) return bsearch(A, x, m

STL 二分查找三兄弟(lower_bound(),upper_bound(),binary_search())

一:起因 (1)STL中关于二分查找的函数有三个:lower_bound .upper_bound .binary_search  -- 这三个函数都运用于有序区间(当然这也是运用二分查找 的前提),下面记录一下这两个函数: (2)ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置: (3)ForwardIter up

查找算法(I) 顺序查找 二分查找 索引查找

查找 本文为查找算法的第一部分内容,包括了基本概念,顺序查找.二分查找和索引查找.关于散列表和B树查找的内容,待有空更新吧. 基本概念 查找(search)又称检索,在计算机上对数据表进行查找,就是根据所给条件查找出满足条件的第一条记录(元素)或全部记录. 若没有找到满足条件的记录,则返回特定值,表明查找失败:若查找到满足条件的 第一条记录,则表明查找成功,通常要求返回该记录的存储位置或记录值本身,以便进行进一步处理:若需要查找到满足条件的所有记录,则可看做在多个区间内连 续查找到满足条件的第一

二分查找里的upper bound与lower bound的实现与分析

1. 问题引入 最近参选了学堂在线的课程数据结构(2015秋).课程由清华大学的邓俊辉老师主讲,在完成课后作业时,遇到了这样一个题目范围查询.在这个题目中,我需要解决这样一个子问题:给定了一组已经排好序的整数集合A[0...n]和一组闭区间[L,R],求这个整数集合中落在这个区间中的点的个数.解决这个问题,我们很容易想到查找效率很高的二分查找,但是这又不是一般求key是否在一个数组里面的二分查找问题.对于区间左端点L,要找到数组里面大于或等于它的最小的元素的下标indexL.对于区间右端点R,要

二分查找的探讨

/* 二分查找 普通版 bs(); 求下界 low_bs(); 求上界 up_bs(); */ #include <cstdio> #include <algorithm> using namespace std; //[l,r) int bs(int *T,int l,int r,int v) { int m; while(l<r) { m = l +(r - l) / 2; //注意 >>1 要加括号 if(T[m] == v) return m; if(T[