[swustoj 1092] 二分查找的最大次数
二分查找的最大次数(1092)
问题描述
这里是一个在排序好的数组A(从小到大)中查找整数X的函数,返回值是查找次数。
int binarySearch(inta[],int n,int x)//数组,数组大小,查找的数据
{
int cnt=;
int L=,R=n-,mid;
while(true)
{
cnt++;
mid=(L+R)/;
if(a[mid]==x) returncnt;
elseif(x<a[mid])R=mid;
else L=mid+;
}
return -;
}
现在的问题是,数组a中某些数据损坏了,我们只知道数组中的一部分数据和数组的大小N,我们想知道查找整数X最大的可能的查找次数,我们假设数组中每个数都不相同,且X一定出现在原数组中,a在被损坏前的是已经排好序的。
输入
多组测试数据,每组第一行是数组大小N(1<=N<=100000),第二行是这个数组的数,这个数组都是正数,-1表示这个数据被损坏。第三行是查找的正整数X。数据都在32位以内。
输出
X的最大查找次数。
样例输入
1 2 3 4 5
1 -1 -1 -1 5
-1 -1 -1 -1 -1
样例输出
好像没什么说的
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100010 int n,k;
int a[N];
int ans[N]; int bs(int k)
{
int cnt=;
int l=,r=n-;
while(l<=r)
{
cnt++;
int m=(l+r)>>;
if(a[m]==k) return cnt;
else if(k<a[m]) r=m;
else l=m+;
}
}
int init()
{
for(int i=;i<n;i++) a[i]=i;
for(int i=;i<n;i++) ans[i]=bs(a[i]);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
for(int i=;i<n;i++) scanf("%d",&a[i]);
scanf("%d",&k); //确定k的范围
int L=,R=n-;
for(int i=;i<n;i++)
{
if(a[i]==-) continue;
if(a[i]<k) L=i+;
else if(a[i]==k)
{L=R=i;break;}
else if(a[i]>k)
{R=i-;break;}
}
int ret=;
for(int i=L;i<=R;i++)
{
ret=max(ret,ans[i]);
}
cout<<ret<<"\r\n";
}
return ;
}
[swustoj 1092] 二分查找的最大次数的更多相关文章
- 九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找
题目地址:http://ac.jobdu.com/problem.php?pid=1349 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数 ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){ if ( ...
- Java实现的二分查找算法
二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...
- 从一个NOI题目再学习二分查找。
二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...
- List<T>线性查找和二分查找BinarySearch效率分析
今天因为要用到List的查找功能,所以写了一段测试代码,测试线性查找和二分查找的性能差距,以决定选择哪种查找方式. 线性查找:Contains,Find,IndexOf都是线性查找. 二分查找:Bin ...
- 二分查找(Binary Search)
二分查找(Binary Search): int BinarySearch(int *array, int N, int key) { ; int left, right, mid; left = ; ...
- leetcode二分查找问题整理
自从做完leetcode上的三道关于二分查找的题后,我觉得它是比链表找环还恶心的题,首先能写出bugfree代码的人就不多,而且可以有各种变形,适合面试的时候不断挑战面试者,一个程序猿写代码解决问题的 ...
- java数据结构学习(一)之二分查找
二分查找法与我们在孩童时期玩过的猜数的游戏一样,这个游戏里一个朋友会让你猜他正想的一个1至100的数,当你猜了一个数后,他会告诉你三种选择的一个:你猜的比她想的大,或小,或猜中了.为了能用最少的次 ...
- Java基础知识强化60:经典查找之二分查找
1. 二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 比较 ...
随机推荐
- 百度地图api的实现
获取客户端IP地址经纬度所在城市 <?php $getIp=$_SERVER["REMOTE_ADDR"]; echo 'IP:',$getIp; echo ''; $con ...
- fragment第二次载入就报错
1.布局中加入一个<fragment 标签,第一次载入的时候是正常的,第二次加载的时候,就直接crashed,退出 2.查到原因Caused by: java.lang.IllegalArgum ...
- 汽车之家, 比亚迪等成为开源数据库SSDB的用户
开源的 NoSQL 数据库 SSDB 已经一岁多了! 在这一年中, SSDB 不断被应用在众多业界知名互联网企业, 创业团队的产品中. 最近, 比亚迪汽车也成为 SSDB 的用户, 其将 SSDB 作 ...
- 【BZOJ 1834】 [ZJOI2010]network 网络扩容
Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的 ...
- sql之表的表达式
1.派生表 实质:就是特殊的子查询(将查询结果放在from后面) 含有一张Order表: 看下面的sql语句: select orderid,orderdate,custid from ( selec ...
- Sql之表的连接总结
1.交叉连接(就是将两张表的数据 交叉组合在一起) 有两张表 客户表:[Sales.Customers] 和订单表:[Sales.Orders]. 业务需求:实现 Customer中custid(客户 ...
- NSString常用方法
--实例化方法-------------- NSString *str = [[NSString alloc] init]; NSString *str = [[[NSString alloc] in ...
- dtGrid插件集成到Angular环境实现表格化数据展现
00没有抱怨的世界 周末效率好低,两天没更了,看看这看看那,装了个win10发现触摸板驱动不适配,然后找了好久都不行,23333. AngularJS用的时间很短,高级的用法有点吃不消了,$diges ...
- select count(*)和select count(1)的区别 (转)
A 一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的 假如表沒有主键(Primary key), 那么count(1)比count(*)快, 如果有主键 ...
- Comet、SSE、Web Socket
来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(十一) Comet Comet是一种更加高级的Ajax技术("服务器推送&qu ...