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 ...
随机推荐
- bit Byte KB MB GB TB 单位换算
1TB = 1024G 1G = 1024M 1M = 1024K 1K = 1024 byte 1 byte = 8 bit
- 使用AirDroid控制百度影棒
十一假期的时候看到有促销活动买了一个百度影棒2S+.话说这东西当做普通家庭客厅的电视盒子还差点火候,不论是操作还是内容用起来都有点折腾.(当然,有些是形势所迫,大家都懂.) 不过,如果就把它看作是普通 ...
- hdu-2680 Choose the best route---dijkstra+反向存图或者建立超级源点
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2680 题目大意: 给你一个有向图,一个起点集合,一个终点,求最短路 解题思路: 1.自己多加一个超级 ...
- Exception handling 异常处理的本质
异常处理的本质:状态回滚或者状态维护. https://en.wikipedia.org/wiki/Exception_handling In general, an exception breaks ...
- Object.prototype.toString的应用
使用Object.prototype上的原生toString()方法判断数据类型,使用方法如下: Object.prototype.toString.call(value)1.判断基本类型: Obje ...
- python剑指offer 链表中环的入口节点
题目: 一个链表中包含环,请找出该链表的环的入口结点. 思路: 先说个定理:两个指针一个fast.一个slow同时从一个链表的头部出发, fast一次走2步,slow一次走一步,如果该链表有环,两个指 ...
- python_55_局部和全局变量
school='Hebut'#school为全局变量 sex='male'#全局变量 names=['Wang Yu','Bai Jingyi','Zhang Yu'] hobby='姑娘' def ...
- [solr 管理界面] - 索引数据删除
删除solr索引数据,使用XML有两种写法: 1) <delete><id>1</id></delete> <commit/> 2) < ...
- 对象 -----JavaScript
本文摘要:http://www.liaoxuefeng.com/ JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成. JavaScript的对象用于描述现实世界中的某个对象.例如 ...
- 从多个textarea中随机选取一个内容
<div id="IMContentTest"> <textarea name="IMContent" class="IMClass ...