题目如下:

天堂_珍珠pearl

Description 

我有很多很多(n条)用魔法合成的珍珠项链……(其实神仙比凡人更爱美),每天起来我都要从中挑一条戴上……挑哪条很有讲究,如果比情敌**的难看,那么就会被**(-_-),如果比天后Hera的好看,那么就完蛋了(-_-)。所以我希望你能帮帮我,解决这个令人头疼的问题——每天帮我算算,那天我能戴的项链有多少条。

Input 

第一行为正整数n(项链总条数)。
第二行有n个整数(代表每条项链晶的好看程度Xi,0<=Xi<=maxlongint。)
第三行为正整数m,表示总天数(也就是总询问次数)。
以下m行,每行两个整数Ai,Bi(1<=Ai,Bi<=maxlongint),询问好看程度在Ai到Bi之间的项链条数(含等于Ai或Bi的,Ai与Bi大小关系不确定)。

Output 

输出m行,对于每次询问输出一行,从Ai到Bi(含Ai,Bi)好看程度在Ai到Bi之间的项链条数。

Sample Input 

7

8 2 3 5 6 7 7

6

1 5

8 6

1 10

5 5

4 4

7 8

Sample Output 

3

4

7

1

0

3

Hint 

对于25%数据,有m,n<=1000。
对于100%数据,有m,n<=100000。

本题题目意思简述:有n条项链,总天数有m天,你要找到每天好看程度在Ai到Bi之间的项链条数。

通过对题目的简述,题目的意图也就显而易见了。可用二分算法求上界和下界,再用下界减去上界即为答案。运用二分查找的条件:题目的数据必须是有序的,单调递增或单调递减。我们只需把N条项链排一次序,使之变成单调递增,就可以运用二分查找了。

为了方便寻求上界和下界,我们可将a【0】设为-1,a【n+1】设为无穷大。

编写函数求上界下界:

求下界:

由于Ai与Bi大小关系不确定,所以可用变量c来保存min(Ai,Bi) ,设变量l为0,r为n+1,m每次等于(l+r)除以2。判断m如果小于c,则m和m左侧的数都不是下界,l=m。大于或等于c,则可能是下界,r=m。最后返回值r就行了。

求上界:
  由于Ai与Bi大小关系不确定,所以可用变量b来保存max(Ai,Bi) ,设变量l为0,r为n+1,m每次等于(l+r)除以2。为了,方便计算,所以求上界为b+1,。判断m如果小于等于b,则m和m左侧的数都不是上界,l=m。大于c,则可能是下界,r=m。最后返回值r就行了。

程序如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
long long n,a[100005],m,ai,bi,b,c,d,l,r;
int findleft(int x)// 求下界
{int left=0,right=n+1,mid;while(left+1<right){mid=(left+right)/2;if(a[mid]<x)left=mid;elseright=mid;}return right;
}
int findright(int x)//求上界
{int left=0,right=n+1,mid;while(left+1<right){mid=(left+right)/2;if(a[mid]>x)right=mid;elseleft=mid;}return right;
}
int main()
{freopen("pearl.in","r",stdin);freopen("pearl.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+n+1);//对A数组排序 scanf("%d",&m);a[0]=-1;a[n+1]=a[n]+1;//定边界 for(int i=1;i<=m;i++){scanf("%d%d",&ai,&bi);d=0;b=max(ai,bi);c=min(ai,bi);//保存较大和较小值 d=findright(b)-findleft(c);printf("%d\n",d);}return 0;
}

二分查找--天堂珍珠(珍珠项链)pearl相关推荐

  1. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  2. LeetCode简单题之二分查找

    题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...

  3. 二分查找模板全面总结

    二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...

  4. 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)

    目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...

  5. 二分查找算法的一点改进

    在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法.这种搜索算法每一次比较都使搜索范围减半.第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年 ...

  6. 二分法:二分查找(递归+非递归)实现

    二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较: 如果两者相等,则查找成功; 否则利用中间位置将表分成前.后两个子表: 1)如果中间位置的关键字大于查找关 ...

  7. python数据结构与算法:二分查找

    二分查找:python 实现 def binary_seaech(alist,item):"""二分查找 递归实现"""n = len(al ...

  8. 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作

    目录 一.lower_bound 1.原型: 2.说明: 3.官方demo 二.upper_bound 1.原型: 2.说明: 3.官方demo 三.binary_search 1.原型: 2.说明: ...

  9. 二分查找的循环实现和递归实现

    自己实现了二分查找的循环实现和递归实现 说明:二分查找适用于顺序存储结构,不适于链式存储结构,是一个高效的查找方法.虽然折半查找效率高,但是要排序,排序本身是一种很费时的运算.     要求传入的表是 ...

  10. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

最新文章

  1. Linux虚拟内存与线性地址翻译
  2. 400名微软员工详细薪资信息泄露,资历和国籍对薪资影响巨大!
  3. java栈代码执行_这段实现栈的java代码执行错误..
  4. C++ OJ在线编程常见输入输出技巧与示例
  5. Action Service Dao三层的功能划分
  6. order by case when
  7. 编程不仅是写代码!?
  8. 微信又干了件大好事 老司机们快看!
  9. go高性能tcp服务器,在Go中构建并发TCP服务器
  10. 做好嘈杂环境的语音识别,目前难点主要在哪里?
  11. 如何更好利用大数据的优势
  12. 2019/7/25 node.js
  13. visual studio 2010解决无法使用framework2.0、3.0、3.5方案
  14. Word打开后出现乱码
  15. 在EWF上启用一个Hibernate Once/Resume Many环境
  16. IDEA打包普通Java web项目
  17. Ruby新手入门之gem配置
  18. 信息系统项目管理师计算题(进度管理总浮动时间、自由浮动时间、工期)
  19. 布控球可接入电网安全接入平台及电网统一视频
  20. PHP在线客服系统平台源码(完全开源的网页在线客服系统)

热门文章

  1. 算法创作|什么是数据结构
  2. CP2102 USB to UART Bridge Controller 驱动安装(windows or Ubuntu)
  3. mysql 判断当前星期_MySQL获取星期的函数
  4. 嗅探器c语言源码,自己做的嗅探器
  5. 项目管理—领导力与管理的区别
  6. 微分中的dx和delta x
  7. 编程猫李天驰:让编程教育回归互联网
  8. 哈尔滨信息应用计算机,[哈尔滨工业大学]计算机应用技术
  9. VMware如何安装windows10教程
  10. php网页显示左中,php的动态页面在ie内核的浏览器面整体偏左的解决方法静