二分查找

[POJ](1064)Cable master ---二分查找(查找)

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-07 10:39:41
Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 50208 Accepted: 10558 Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The Judging Committee has volunteered and has promised to organize the most honest contest ever. It was decided to connect computers for the contestants using a "star" topology - i.e. connect them all to a single central hub. To organize a truly honest contest, the Head of the Judging Committee has decreed to place all contestants evenly around the hub on an equal distance from it. To buy network cables, the

POJ 1064Cable master(二分查找)

喜你入骨 提交于 2019-12-07 10:37:04
题目链接: http://poj.org/problem?id=1064 【中文题意】有n条绳子,他们的长度分别为Li。如果从它们中切割出K条长度相同的绳子的话,这K条绳子每条最长能有多长?答案保留到小数点后2位。 【思路分析】二分查找绳子的长度。找到最大的符合条件的。 【AC代码】 #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<stack> #include<map> #include<algorithm> using namespace std ; #define N 10005 int n,k; double INF= 110005 ; double L[N]; bool C( double x) { int num= 0 ; for ( int i= 0 ;i<n;i++) { num+=L[i]/x; } return num>=k; } void solve() { double lb= 0 ,ub=INF; while (ub-lb> 1e-5 ) { double mid=(lb+ub)/ 2.0 ; if (C(mid))lb=mid; else ub=mid; } printf ( "%.2f\n" , floor

poj 1064 Cable master - 二分查找

倖福魔咒の 提交于 2019-12-07 10:36:08
Cable master Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The Judging Committee has volunteered and has promised to organize the most honest contest ever. It was decided to connect computers for the contestants using a "star" topology - i.e. connect them all to a single central hub. To organize a truly honest contest, the Head of the Judging Committee has decreed to place all contestants evenly around the hub on an equal distance from it. To buy network cables, the Judging Committee has contacted a local network solutions provider with a

我对于二分查找的一点理解

和自甴很熟 提交于 2019-12-06 14:09:23
二分法 对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近 零点 ,进而得到零点近似值的方法叫二分法。 这就是我高中接触的二分法,最开始觉得这个方法秒啊!但是时间长之后也就啥也不记得了,等到自己学了计算机开始上手算法就发现这个二分查找的频率确实有点高,所以想要总结一下这个二分查找。 直接说题,由题出结论: leetcode 69题: 实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 首先是我最开始的想法,从0遍历到x/2,因为平方根一定是小于等于x/2,所以我开始敲代码,后来我在1、0、2这几个节点上面纠结了很长时间,后来我发现着根本就不对,后来我又想用栈来做,在遍历的时候如果i*i<=x就push,如果大于就返回栈顶元素。后来我发现这种方法,不光时间复杂度没有改变,空间复杂度还变大了。看了题解发现是二分查找,仔细看了以后才发现 真是秒啊! 1 class Solution { 2 public int mySqrt(int x) { 3 long left =0; 4 long right = (x>>>1)+1;//我又被这个>>>1给弄蒙蔽了,每次都忘记了这个位运算的意义 5

查找 | 二分查找/折半查找

一个人想着一个人 提交于 2019-12-05 03:57:02
//二分查找法 #include <stdio.h> #define MaxSize 8 typedef struct {   int stuno;   char stuname[20]; }TableElem; TableElem stu[]={{1001,"zhang"},{1009,"wang"},{2005,"sun"},{2008,"liu"},{3001,"zheng"}, {3005,"lai"},{4003,"qin"},{4400,"ren"}}; typedef struct {   TableElem elem[MaxSize];   int n; }SqTable; //二分查找函数 int bin_search(SqTable T,int key) {   int low,high,mid;   low=1;   high=T.n;   while(low<high)   {     mid=(low+high)/2;     if(T.elem[mid].stuno==key)       return mid;     else if(key<T.elem[mid].stuno)       high=mid-1;     else       low=mid+1;   }   return 1; } /* int searchsqtable

Java小白常问的问题大全

☆樱花仙子☆ 提交于 2019-12-05 03:08:21
Java小白在初学Java时都会遇到各种各样的问题,小编来总结一下一些常见的问题。比如,可以用%除以一个小数吗?a+=b和a=a+b的效果有区别吗?声明一个数组为什么需要花费大量时间?为什么Java库不用随机pivot方式的快速排序? 如果有想学习java的同学,可来我们的java技术学习QQ群的哦:745446493里面免费送整套系统的java教程! 基本数据类型 1.我可以用%除以一个小数吗? 当然可以。比如,如果angle是一个非负数,那么angle%(2*Math.PI)就会把angle转换到0到2π之间。 2.当ab都是基本类型变量时,a+=b和a=a+b的效果有区别吗? 当a和b的类型不同时,那两条语句的效果就可能有区别。a+=b等同于a=(int)(a+b),这种情况下可以是a是int型,b是float型。但是同等情况下a=a+b就会编译报错。 3.为什么-0/3结果是0,而-0.0 /3.0结果是-0.0?(注意后边的结果0带负号) 在Java里,整数是用补码表示的。在补码中0只有一种表示方法。另一方面,浮点数则是用IEEE标准表示的,对于0有两种表示方法,0和-0。 条件语句和循环语句 1.为什么判断字符串相等不能使用==? 这反映了基础类型(int,double,boolean)和引用类型(String)的区别。 2.有没有在什么情况下

数据结构与算法之美学习笔记:第十五讲

浪子不回头ぞ 提交于 2019-12-05 00:26:19
一、课前问题 今天我们讲一种针对有序数据集合的查找算法:二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,很多非计算机专业的同学很容易就能理解, 但是看似越简单的东西往往越难掌握好,想要灵活应用就更加困难。老规矩,我们还是来看一道思考题。 假设我们有1000万个整数数据,每个数据占8个字节, 如何设计数据结构和算法,快速判断某个整数是否出现在这1000万数据中? 我们希望这个功能不要占用太多的内存空间, 最多不要超过100MB,你会怎么做呢?带着这个问题,让我们进行今天的内容吧! 二、无处不在的二分思想 二分查找是一种非常简单易懂的快速查找算法,生活中到处可见。比如说,我们现在来做一个猜字游戏。我随机写一个0到99之间的数字,然后你来猜我写的是什么。猜的过程中, 你每猜一次,我就会告诉你猜的对了还是错了,直到猜中为止。你来想想, 如何快速猜中我写的数字呢? 假设我写的数字是23,你可以按照下面的步骤来试一试。(如果猜测范围的数字有偶数个,中间数有两个,就选择较小的那个。) 7次就猜出来了,是不是很快?这个例子用的就是二分思想, 按照这个思想,即便我让你猜的是0到999的数字,最多也只要10次就能猜中。不信的话,你可以试一试。 这是一个生活中的例子,我们现在回到实际的开发场景中。 假设有1000条订单数据,已经按照订单金额从小到大排序,

二分查找java实现

隐身守侯 提交于 2019-12-04 21:34:00
     二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。   二分查找思路非常简单,由粗暴的遍历查找改为了将元素排序后不断的进行折半查找,将搜索的时间复杂度 由O(N)降到了O(log 2 N) 。   二分查找的思路与 二叉查找树 的查找过程完全相同,我们将一个经过排序的数组看做一棵平衡的二叉查找树,那么 数组的中点便是树的根节点。折半后的中点是下一层子树的根节点 ,以此类推。我们通过不断的判断目标值与各树根节点的值的大小来决定下一步查找根节点的左子树还是右子树。   在实现时,我们可以维护两个指针left和right,指针之间的范围便是我们的查找范围。查找过程如下:   首先判断 边界条件 ,left位置的值与right位置的值是否包含目标值,若包含则查找结束;     通过left与right的位置找到当前范围的中点mid,即mid的值为(left+right)/2;     如果mid的值便是target的值,查找结束;     如果left与right已经是相邻的元素,那么证明数组中没有目标值,查找结束;     如果目标值大于mid则在mid、right间继续查找,即将mid的值赋予left;     反之在left与mid间继续查找

二分查找

爱⌒轻易说出口 提交于 2019-12-04 08:49:54
二分查找 /** * 二分查找 */ public class BianarySearch { public static void main(String[] args) { int[] arr = {12, 34, 45, 56, 57, 67, 78, 89, 90, 99}; System.out.println(getIndex(arr, 99)); } public static int getIndex(int[] arr, int value){ int min = 0; int max = arr.length-1; int mid = (min+max)/2; while(arr[mid] != value){ if(arr[mid] > value){ max = mid - 1; }else if(arr[mid] < value){ min = mid + 1; } mid = (min+max)/2; if(min > max){ return -1; } } return mid; } } 来源: https://www.cnblogs.com/OldFour/p/11851023.html

插值查找

ぃ、小莉子 提交于 2019-12-04 03:44:00
概念介绍   有同学想了解插值查找,今天它来了!想了解插值查找,就得先了解二分查找的原理,对于不知道二分查找的小伙伴,可以去简单学习一下,送上超链接 https://www.cnblogs.com/maguanyue/p/11675567.html 。插值查找和二分查找十分的相似,它们唯一的区别就是:二分查找的每次查找点=(最大值+最小值)/2,是一个固定值。而插值查找的每次查找点的下标=最小值+ (最大值- 最小值) * (目标值- a[最小值下表]) / (a[最大值下表] - a[最小值下表]),这样做的目的是为了使得查找点变为自适应选择,从而提高查找的效率。   我们还是用二分查找中的数组举例子,这次我们的需求是在arr=[1,3,5,7,9,10,13,18],找到1。    二分查找:   在二分查找的算法中记录被调用打印日志,说明二分查找被调用了。   二分查找的过程在这里我们就不进行推导了,直接看二分查找的结果。   对二分查找进行调用。   结果:   说明在arr=[1,3,5,7,9,10,13,18],找到1,二分查找被调用了3次。    插值查找:   先带入公式,获取中值及其下标int mid = start + (end - start) * (findValue - arr[start]) / (arr[end] - arr[start]),int