首页 > 编程语言 >【基础算法】二分查找

【基础算法】二分查找

时间:2024-03-03 20:11:33浏览次数:27  
标签:二分 num cout int mid while 算法 查找

二分查找

什么是二分?将问题分成两个部分。

猜数游戏

计算机给你一个范围内的随机数,你要输入一个数,计算机给你反馈是太大了还是太小了,直到你输出正确的答案。

怎么设计这个程序呢?

#include<iostream>
#include<ctime>
using namespace std;
int main()
{
    srand(time(NULL));
    int t = rand() % 100 + 1;
    int x;
    cout << "请输入一个数字:";
    cin >> x;
    while (x != t)
    {
        if (x > t)
        {
            cout << "您输入的数字太大了!" << endl;
        }
        else
        {
            cout << "您输入的数字太小了!" << endl;
        }
        cout << "请输入一个数字:";
        cin >> x;
    }
    cout << "恭喜你猜对了!";
    return 0;
}

是不是我们在系统给出提示的基础上判断了这个数所在的区间呢。这样我们就可以不断缩小区间,找到这个数。

提问:我们是随便输入的这个区间里的数字吗?

提问:如果换成不是有序的序列,我们还能这样猜吗?

所以,二分的条件是:单调有序序列、将问题划分为可行域和不可行域。

二分的常用模版:

while (l <= r)
{
    int mid = l + r >> 1;
    if (check(mid)) r = mid - 1;
    else l = mid + 1;
}

跳出循环后的 \(l\) 和 \(r\) 代表什么意思呢?

例一:P2249 查找

#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
int n, m;
int a[N];
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i <= m; i++)
	{
		int x;
		cin >> x;
		int l = 1, r = n;
		while (l <= r)
		{
			int mid = l + r >> 1;
			if (a[mid] >= x) r = mid - 1;
			else l = mid + 1;
		}
		if (a[l] == x) cout << l << " ";
		else cout << -1 << " ";
	}
	return 0;
}

例二:P1918 保龄球

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m;
struct Node
{
	int num, id;
} s[N];

bool cmp(Node &n1, Node &n2)
{
	return n1.num < n2.num;
}

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		int num;
		cin >> num;
		//s[i] = {num, i};
		s[i].num = num;
		s[i].id = i;
	}
	sort(s + 1, s + 1 + n, cmp);// 按数量升序排列
	cin >> m;
	while (m --)
	{
		int x;
		cin >> x;
		int l = 1, r = n;
		while (l <= r)
		{
			int mid = l + r >> 1;
			//cout << mid << endl;
			if (s[mid].num < x) l = mid + 1;
			else r = mid - 1;
		}
		if (s[l].num == x) cout << s[l].id << endl;
		else cout << 0 << endl;
	}
	return 0;
}

标签:二分,num,cout,int,mid,while,算法,查找
From: https://www.cnblogs.com/yhgm/p/18050600

相关文章

  • 【基础算法】二分答案
    二分答案什么是二分答案?将答案区间进行二分,不断缩小答案区间,直到区间缩小到符合题意的答案。我们又该怎么书写呢?常用的二分模版://不断缩小答案区间while(l<=r){intmid=l+r>>1;if(check(mid))r=mid-1;elsel=mid+1;}模版的含义\(......
  • 如何判断算法的好坏?
    事后统计法(直接运行两个算法程序后比较运行速度)1.过于依赖测试数据 2.过于依赖硬件条件事前分析法     时间复杂度  大O表示法  ......
  • 动手学强化学习(五):时序差分算法
    第5章时序差分算法5.1简介第4章介绍的动态规划算法要求马尔可夫决策过程是已知的,即要求与智能体交互的环境是完全已知的(例如迷宫或者给定规则的网格世界)。在此条件下,智能体其实并不需要和环境真正交互来采样数据,直接用动态规划算法就可以解出最优价值或策略。这就好比对于......
  • Educational Codeforces Round 143 (Rated for Div. 2)C. Tea Tasting(前缀和+二分、
    C.TeaTasting思路这里枚举有三种思路然后经过考虑3是最可行的,然后接着考虑如何计算贡献这里在实现的时候用了一个差分数组,因为我们需要记录第i个茶师它喝了多少个\(b_i\)以及不满\(b_i\)的用\(c_i\)记录,最后计算一下答案即可。#include<bits/stdc++.h>#defineintlon......
  • 算法模板 v1.9.1.20240303
    算法模板v1.1.1.20240115:之前历史版本已不可寻,创建第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”;删除“编译”-“手动开O优化”;修改“编译”-“CF模板”;删除“读写”;删除“图论”-“欧拉图”-“混合图”;删除“图论”-“可达性统计”;删除“数据类型”-“高精类”。......
  • day52 动态规划part10 代码随想录算法训练营 122. 买卖股票的最佳时机 II
    题目:122.买卖股票的最佳时机II我的感悟:只要定义清楚,就可以做出来的。理解难点:先判断等于听课笔记:看了文字版本,感觉还是我的思路最牛逼!!我的代码:classSolution:defmaxProfit(self,prices:List[int])->int:#dp[i]为截止到当前能获得的最大利润......
  • unhide 是一款强大的取证工具,主要用于查找和发现被隐藏的进程、TCP/UDP端口以及其他隐
    unhide是一款强大的取证工具,主要用于查找和发现被隐藏的进程、TCP/UDP端口以及其他隐藏技术。其基本技术原理如下:ROOTKIT和LKM:ROOTKIT(RootKit)是一种恶意软件,常用于隐藏恶意活动和进程。它通过修改操作系统的核心组件和内核模块(LinuxKernelModule,LKM)来实现对系统的隐匿。u......
  • 局部匹配的查找
    问题:存在包含指定内容的返回“是”,否则返回“否”。函数公式解决:查找范围为同行:=IF(COUNTIF(B2,"*"&A2&"*"),"是","否")查找范围不限定行:=IF(COUNTIF(B:B,"*"&A2&"*"),"是","否")CountIf的条件使用前后都带通配符星号,表示“包含”。 ......
  • day53 动态规划part10 代码随想录算法训练营 121. 买卖股票的最佳时机
    题目:121.买卖股票的最佳时机我的感悟:soeasy 打印dp确实能发现问题理解难点:注意条件,及时更新dp听课笔记:看了,老师的代码,感觉没有我的简洁,哈哈!!我的代码:classSolution:defmaxProfit(self,prices:List[int])->int:#设dp[i]为截止到当前能获得......
  • 动手学强化学习(四):动态规划算法
    第4章动态规划算法4.1简介动态规划(dynamicprogramming)是程序设计算法中非常重要的内容,能够高效解决一些经典问题,例如背包问题和最短路径规划。动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到目标问题的解。动态规划会保存已解决......