TOJ 3750: 二分查找
3750: 二分查找

Total Submit: 1925 Accepted:759
Description
将n个从小到大排序的整数(n<1000000)从1~n进行编号,并一个待查找的整数m,请使用二分法进行查找。
Input
输入包括3行,第一行为整数n,第二行包括n个整数,以空格分隔,第三行为整数m。
Output
如果能够在序列中找到整数m,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None。
Sample Input
10
1 2 4 5 6 7 8 9 10 11
10
10
1 2 4 5 6 7 8 9 10 11
12
Sample Output
9
None
一个二分查找的数据结构题,第一次我竟然TLE了,这个会有重复的啊,所以重复我就向前搜索,这个TLE可能是我查询到中间的时候他就找到了,但是这个数确很靠前,所以借助了辅助数组就过了,那这个题也可以测试下移位运算符啊,但是我觉得这个移位运算符并没有快多少,所以我要想缩短时间还可以用lower_bound,但是速度也是没有提升太多的。想一下用map去重,map插入运算本来就要耗时,所以还是TLE了,所以好奇怪第一名究竟用了什么做法
一般二分
#include <stdio.h>
int a[],b[],n,t;
int BS(){
int l=,r=n-;
while(l<=r) {
int m=(l+r)>>;
if(t<a[m])
r=m-;
else {
if(t>a[m])
l=m+;
else
return m;
}
}
return -;
}
int main(){
while(~scanf("%d",&n)){
scanf("%d",&a[]);
b[]=;
for(int i=;i<n;i++){
scanf("%d",&a[i]);
if(a[i]==a[i-])
b[i]=b[i-];
else b[i]=i+;}
scanf("%d",&t);
if(a[]==t)
puts("");
else{
int f=BS();
if(f!=-){
printf("%d\n",b[f]);
}
else
puts("None");
}}
return ;
}
上面的二分用空间过多,继续二分下去,也就是看下左边和它相等么,但是这个速度也上不去,改下哈夫曼树的不同判断也不行
#include <stdio.h>
int a[],n,t;
int BS(){
int l=,r=n-;
while(l<=r){
int m=(l+r)>>;
if(t<a[m])
r=m-;
else if(t>a[m])
l=m+;
else if(a[m-]<t)
return m;
else r=m-;
}
return -;
}
int main(){
while(~scanf("%d",&n)){
for(int i=;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&t);
if(a[]==t)
puts("");
else{
int f=BS();
if(f!=-){
printf("%d\n",f+);
}
else
puts("None");
}}
return ;
}
库函数提供的二分
#include <stdio.h>
#include <algorithm>
using namespace std;
int a[],n,t;
int main(){
while(~scanf("%d",&n)){
for(int i=;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&t);
int f=lower_bound(a,a+n,t)-a;
if(a[f]==t)
printf("%d\n",f+);
else
printf("None\n");
}
return ;
}
TOJ 3750: 二分查找的更多相关文章
- jvascript 顺序查找和二分查找法
第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...
- Java实现的二分查找算法
二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...
- 从一个NOI题目再学习二分查找。
二分法的基本思路是对一个有序序列(递增递减都可以)查找时,测试一个中间下标处的值,若值比期待值小,则在更大的一侧进行查找(反之亦然),查找时再次二分.这比顺序访问要少很多访问量,效率很高. 设:low ...
- java实现二分查找
/** * 二分查找 * @param a * @param n * @param value * @return * @date 2016-10-8 * @author shaobn */ publ ...
- 最新IP地址数据库 二分逼近&二分查找 高效解析800万大数据之区域分布
最新IP地址数据库 来自 qqzeng.com 利用二分逼近法(bisection method) ,每秒300多万, 比较高效! 原来的顺序查找算法 效率比较低 readonly string i ...
- c#-二分查找-算法
折半搜索,也称二分查找算法.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: B 如果某一特定元素大于或者小 ...
- 【Python】二分查找算法
二分查找:在一段数字内,找到中间值,判断要找的值和中间值大小的比较.如果中间值大一些,则在中间值的左侧区域继续按照上述方式查找.如果中间值小一些,则在中间值的右侧区域继续按照上述方式查找.直到找到我们 ...
- PHP实现文本快速查找 - 二分查找
PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...
- java二分查找举例讨论
最近做笔试题有这么一个关于二分查找的例子. 给一个有序数组,和一个查找目标,用二分查找找出目标所在index,如果不存在,则返回-1-(其应该出现的位置),比如在0,6,9,15,18中找15,返回3 ...
随机推荐
- 关于Windows创建进程的过程
之前有听到别人的面试题是问系统创建进程的具体过程是什么,首先想到的是CreateProcess,但是对于具体过程却不是很清楚,今天整理一下. 从操作系统的角度来说 创建进程步骤: 1.申 ...
- SAP云平台运行环境Cloud Foundry和Neo的区别
SAP云平台提供了两套运行环境:Cloud Foundry和Neo 从下图能发现,Cloud Foundry的运行环境,基础设施由第三方公司提供,比如Amazon亚马逊和Microsoft微软,SAP ...
- SAP Netweaver的负载均衡消息服务器 vs CloudFoundry的App Router
Message server for ABAP Netweaver SAP传统应用经典的三层架构: 起到负载均衡的消息服务器(Message Server)在图中没有得到体现.然后,消息服务器在我们每 ...
- JS事件阻止冒泡的写法
$("body").on("click", "#id", function (ev) { ev = ev || event;要写的逻辑代码 ...
- object-detection-crowdai数据处理
import os file=os.listdir('/home/xingyuzhou/object-detection-crowdai') file.sort(key= lambda x:int(x ...
- Luogu [P2814] 家谱
题目链接 这个题不难,但是有点小小坑. 首先并查集肯定能看出来. 然后字符串的话,一开始我想用 hash 来处理,但想了想,离散化不好搞,人也太多了,一不小心就hash重了,还是算了. 然后就想到了S ...
- js表单序列化时,非空判断
在项目中,对于数据的传输一般需要非空的判断,而数据字段较多时一般直接将表单序列化,此时如何判断非空,如下 因为将表单序列化时,数据格式为 trainKind=1&trainKindCode=1 ...
- 01_13_JSP编译指令
01_13_JSP编译指令 1. Directive Directive(编译指令)相当于在编译期间的命令 格式: <%@Directive 属性=”属性值”%> 常见的Directive ...
- 自己写一个Promise
参考Promise 的 官方规范 https://promisesaplus.com/ Promise 其实就是一个状态机 它只有两种状态变化 pending => fulfill ...
- 正则python正则,提取\t\n里面的大写英文字母
ss = '['\r\n\t\t\t\t\t\t\t\t\t', '\r\n\t\t\t\t\t\t\t', '\r\n\t\t\t\t\t\t\t\t\tCMA CGM JACQUES JOSEPH ...