二分查找--天堂珍珠(珍珠项链)pearl
题目如下:
天堂_珍珠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相关推荐
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- LeetCode简单题之二分查找
题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...
- 二分查找模板全面总结
二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...
- 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)
目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...
- 二分查找算法的一点改进
在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法.这种搜索算法每一次比较都使搜索范围减半.第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年 ...
- 二分法:二分查找(递归+非递归)实现
二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较: 如果两者相等,则查找成功; 否则利用中间位置将表分成前.后两个子表: 1)如果中间位置的关键字大于查找关 ...
- python数据结构与算法:二分查找
二分查找:python 实现 def binary_seaech(alist,item):"""二分查找 递归实现"""n = len(al ...
- 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作
目录 一.lower_bound 1.原型: 2.说明: 3.官方demo 二.upper_bound 1.原型: 2.说明: 3.官方demo 三.binary_search 1.原型: 2.说明: ...
- 二分查找的循环实现和递归实现
自己实现了二分查找的循环实现和递归实现 说明:二分查找适用于顺序存储结构,不适于链式存储结构,是一个高效的查找方法.虽然折半查找效率高,但是要排序,排序本身是一种很费时的运算. 要求传入的表是 ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
最新文章
- Linux虚拟内存与线性地址翻译
- 400名微软员工详细薪资信息泄露,资历和国籍对薪资影响巨大!
- java栈代码执行_这段实现栈的java代码执行错误..
- C++ OJ在线编程常见输入输出技巧与示例
- Action Service Dao三层的功能划分
- order by case when
- 编程不仅是写代码!?
- 微信又干了件大好事 老司机们快看!
- go高性能tcp服务器,在Go中构建并发TCP服务器
- 做好嘈杂环境的语音识别,目前难点主要在哪里?
- 如何更好利用大数据的优势
- 2019/7/25 node.js
- visual studio 2010解决无法使用framework2.0、3.0、3.5方案
- Word打开后出现乱码
- 在EWF上启用一个Hibernate Once/Resume Many环境
- IDEA打包普通Java web项目
- Ruby新手入门之gem配置
- 信息系统项目管理师计算题(进度管理总浮动时间、自由浮动时间、工期)
- 布控球可接入电网安全接入平台及电网统一视频
- PHP在线客服系统平台源码(完全开源的网页在线客服系统)