mid函数

例2 判断平方数

余生颓废 提交于 2019-12-03 21:30:30
#示例: 输入num=16, 输出True, sqrt(16)=4; 输入num=15, 输出False, sqrt(15)=3.87 class Solution: def isPerfectSquare(self, num): l=0 r=num while (r-l > 1): mid=(l + r) / 2 if (mid * mid <= num): l = mid else: r = mid ans = 1 if ( l * l < num ): ans = r return ans * ans == num #主函数 if __name__ == "__main__": num = 16 print("初始值: ", num) solution = Solution() print("结果: ", solution.isPerfectSquare(num)) 来源: https://www.cnblogs.com/hankleo/p/11809643.html

cf448D Multiplication Table 二分

谁都会走 提交于 2019-12-03 05:34:26
题目: http://codeforces.com/problemset/problem/448/D 题意:给出n,m,k,即在一个n*m的二维数组中找第k大的数,第i行第j列的数的值为i*j。 思路:二分答案,每一行中找比它小的数之和(单调函数),作为check的条件来转移。 #include<bits/stdc++.h> using namespace std; int n,m; long long k; bool check(long long mid) { long long res=0; for(int i=1;i<=n;i++) { res+=min(mid/i,1ll*m); } if(res>=k)return 1; return 0; } int main() { scanf("%d%d%lld",&n,&m,&k); long long l=1,r=1ll*n*m,ans=-1; while(l<=r) { long long mid=l+r>>1; if(check(mid)) { ans=mid; r=mid-1; } else l=mid+1; } printf("%lld\n",ans); return 0; } 来源: https://www.cnblogs.com/myrtle/p/11780221.html

第一个错误的版本

匿名 (未验证) 提交于 2019-12-02 23:32:01
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。 你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。 示例: 给定 n = 5,并且 version = 4 是第一个错误的版本。 调用 isBadVersion(3) -> false 调用 isBadVersion(5) -> true 调用 isBadVersion(4) -> true 所以,4 是第一个错误的版本。 解题思路: 本题是个查找类问题。可以理解为找出类似序列[0 0 0 1 1 1]中第一个值为 1 的元素的下标。采用二分查找求解。 解题时,可以自己想一些测试用例,然后再思考解题思路。 Python: 用到了递归,比较费时。 # The isBadVersion API is already defined for you. # @param version, an integer # @return a bool # def

WHY吃糖果 QDUOJ 二分嵌套

谁都会走 提交于 2019-11-30 19:53:06
WHY吃糖果 QDUOJ 二分嵌套 原题链接 解题思路参考链接 题意 给出一个 \(n*n\) 的矩阵,每个格子的权值为 \(i*i+j*j+i*j+100000*(i-j)\) ,求该矩阵中第m小的权值为多少 解题思路 当列数固定时,这个函数是随着行数的增加而增加的(二次函数简单判断下就行),于是外层的二分进行二分答案,里面的二分进行判断小于等于当前答案的格子有多少个。这样就可以解决问题。参考大佬的思路,可以点击查看。 代码实现 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const ll inf=0x3f3f3f3f3f3f3f3f; ll n, m; ll mul(ll i, ll j) { return i*i+j*j+i*j+100000*(i-j); } ll judge(ll x) { ll ret=0; for(ll j=1; j<=n; j++) { ll l=1, r=n, mid, tmp=0; while(l<=r) { mid=(l+r)>>1; //这是行数 if(mul(mid, j) <= x) { tmp=mid;//在列数一定时,有多少个格子满足要求 l

算法第一次实验报告:改写二分搜索算法的思路与分析

北战南征 提交于 2019-11-30 07:23:44
改写二分搜索算法 思路与分析 题目来源:《计算机算法设计与分析》,王晓东 设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。 输入格式: 输入有两行: 第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。 输出格式: 输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值 输入样例: 在这里给出一组输入。例如: 6 5 2 4 6 8 10 12 输出样例: 在这里给出相应的输出。例如: 1 2——————————————————————————————————分割线——————————————————————————————————————————————思路:对于能够找到的元素,只需要把这个下标再输出一遍即可。对于找不到的元素,我们从优化过的二分搜索算法着手。众所周知,二分搜索算法的左指针和右指针会渐渐靠近,如果要输出这个数离得最近的两个下标,不妨分析left和right的接近情况。【这里我用的是left>right的递归条件,这样子做除了简化代码,还有特殊用处】

LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现

我的梦境 提交于 2019-11-29 21:56:16
题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组   中文:   假设按照升序排序的数组在预先未知的某个点上进行了旋转。   ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。   编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。   英文:   Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.   (i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]).   You are given a target value to search. If found in the array return true, otherwise return false. class Solution(object): def search(self, nums, target): """ :type nums: List[int] :type target: int :rtype: bool """ start=0 ends=len(nums)-1 while

二分写法选讲

此生再无相见时 提交于 2019-11-29 06:48:13
二分写法总结 众所周知,二分是一种特别常用的求解答案的方式。无论是二分查找,还是二分答案,都通过二分思想把求解转化成了判定。这样就大大减少了思维难度,并大大减少了复杂度。但实现二分并不是我们想象的那样简单,实现二分的难点是 判定函数的书写 以及 二分循环的写法 ,判定函数需要根据题目的类型不同具体类型具体分析。那么我们这篇随笔就着重讲解一下 二分的写法 ,以便让大家拍对二分,拍熟二分。 本篇随笔是功能型随笔。默认读者已经明白二分思想并能手写二分,只是对二分到底该怎么写,怎么避免死循环等问题尚有困惑,如果对二分还不了解的读者,请先行补习二分。 二分书写的要点 二分有很多种写法,如果翻看一篇二分题目的题解,我们会发现不同的AC代码中二分写的五花八门。但是他们的结果都是对的。那么,二分书写的要点到底是什么呢? 首先,是循环条件。这个条件是二分书写的 重中之重 ,因为这个条件如果写不对的话,就可能导致二分进行过程中无法退出循环。即导致死循环的情况,而这个条件也决定了二分进行过程中缩小解集范围的书写方式。 然后,是缩小方式。所谓缩小方式,就是缩小下一步要二分的区间,也就是把 \(l,r\) 的值变成 \(mid\) ,但是这个变化暗藏杀机。如果和循环条件配合不好的话,非常容易直接死循环,或者造成 \(mid\) 上的答案取不到(假如答案就是这个 \(mid\) 的话就惨了)等后果。 最后

数论知识整理

淺唱寂寞╮ 提交于 2019-11-29 05:04:21
\[ \large \text { 数论知识目录 及 前置知识:} \] \(gyh\) 实在是太 ⑨ 了,没脑子的他只能整理在这里: 如果以下内容中存在错误 , 请及时通知博主 , 博主会非常感谢您的指正 , 并欢迎您把蠢货博主的头 拧下来 天真的 \(gyh\) 以为写一篇 基础数论知识整理 ,一篇 进阶数论知识整理 就可以囊括所有的数论知识了 , 但是他错了 于是就有了这篇文章,来更条理地整理数论知识。 于 \(2019.5.15\) 创建 于 \(2019.5.16\) 更新了 约数:欧拉函数,约数和 于 \(2019.5.19\) 更新了 欧几里得 与 扩展欧几里得:求解同余方程组 \[ \text{从此开始,一个天文单位} \] \[ \downarrow \]   前置知识: 取整函数 : 下取整: $\lfloor x\rfloor = $不大于 \(x\) 的最大整数 。 例: \(\lfloor 5.5\rfloor = 5\) , \(\lfloor -1.5\rfloor = -2\) . 上取整: $\lceil x \rceil = $ 不小于 \(x\) 的最小整数 。 例: \(\lceil 5.5 \rceil = 6\) , \(\lceil -1.5\rceil = -1\) . 整除: 定义 : 如果 \(a\) 是 \(p\) 的倍数 ,则

洛谷P2678跳石头

送分小仙女□ 提交于 2019-11-28 15:52:44
noip2015提高组day2t1 题目里看到了最大值最小,可以判断用二分答案; 类似关键词还有最小值最大; 前边的最大最小是一种条件,在符合条件的情况下最大或最小; 在该题中则为拿走石头数与题里的m作比较,再一步步缩小mid范围 注意的是终点也有石头,还有坑点是函数里第一块石头也需要和起点作比较 #include<iostream> #include<cstdio> using namespace std; int l,m,n,mid,x; int d[50005]; int fuck(int a){ int ans=0; int rr=0; for(int i=1;i<=n;i++){ if(d[i]-d[rr]<=mid){ ans++; }else{ rr=i; } }return ans; } int main(){ scanf("%d%d%d",&l,&n,&m); d[0]=0; for(int i=1;i<=n;i++){ scanf("%d",&d[i]); } n++; d[n]=l; int left,right; right=l; left=0; while(left<=right){ mid=(left+right)/2; x=fuck(mid); if(x>m){ right=mid-1; }else{ left=mid+1; } }printf("%d

有效的完全平方数

。_饼干妹妹 提交于 2019-11-26 19:14:29
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。 说明:不要使用任何内置的库函数,如 sqrt。 示例 1: 输入:16 输出:True 示例 2: 输入:14 输出:False 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-perfect-square 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 class Solution { public: bool isPerfectSquare(int x) { long left = 1; long right = x; while(left <= right) { long mid = (left + right) / 2; long tmp = x / mid; if(tmp == mid) return (mid*mid == x); else if(tmp > mid) { left = mid + 1; } else if(tmp < mid) { right = mid - 1; } } return (right*right == x); } }; 来源: https://blog.csdn.net/weixin_41791402/article/details