[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. 二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 比较 ...
随机推荐
- vb6-很简单的配置密码验证提示
'很简单的配置密码验证提示 Dim add As String add = Trim(InputBox("请输入配置密码", "报表配置")) If add = ...
- 拓展:return和print的使用时机
拓展:return和print的使用时机 一直纠结函数里的return用法.以下内容摘自百度知道..def 是用来定义函数的一个关键字,只有在函数的定义时用到他.Python 函数定义的语法:def ...
- LeetCode之Single Number以及拓展
Problem 1:一个数组中有一个数字a只出现一次,其他数字都出现了两次.请找出这个只出现一次的数字? 考察知识点:异或运算 思路:比如数字 b^b = 0 a^0 = a 因此,可以将数组 ...
- sirius的python学习笔记(1)
1.可以通过try...except语句来简单的判断字符串是否为整数值,如例程 x = raw_input('>') try: print int(x) except ValueError: r ...
- Hadoop 相关链接
Apache 软件下载 http://mirror.bit.edu.cn/apache/ 相关文档链接: Apache Hadoop 2.5.2 http://hadoop.apache.org ...
- MyBatis定义复合主键
<resultMap type="XX" id="XXMap"> <id property="id" column=& ...
- ios app - 打开系统设置URL
ios --- 调用系统"设置"里的功能(转) 安装后第一次运行软件时,系统会弹出提示用户是否允许软件获取当前位置,如果用户不允许的话,之后运行时系统不会在弹出提示设置,这点很不方 ...
- 实时数据处理环境搭建flume+kafka+storm:1.zookeeper 安装配置
1. 解压 tar -zxvf 2.创建目录 zk根目录创建 mkdir zkdatalog --日志 mkdir zkdata ---快照文件 3.修改配置文 ...
- mybatis(1):入坑篇
依赖 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artif ...
- java小提示:标示符常见命名规则、常用ASCII
标示符常见命名规则: A:包:全部小写B:类或者接口:首字母大写:StudentC:方法或者接口:首字母小写,第二个单词开始开始,每个单词首字母大写:studentAgeD:常量:全部大写,多个单词之 ...