东方博宜oj1236——二分查找

二分查找算法实战:解决有序数组中的元素定位问题

一、题目描述

题目要求在一个有序递增数组(不存在相同元素)中,采用二分查找,找出值 x 的位置,如果 x 在数组中不存在,则输出 -1。输入包括数组元素个数 nn <= 10^6),n 个递增的数组元素(1 <= 数组元素值 <= 10^8),以及要查找的数 x0 <= x <= 10^8)。输出为 x 在数组中的位置,或者 -1

二、代码实现

#include<stdio.h>
int arr[1000];
int check(int mid, int x)
{
	return arr[mid] >= x;//满足返回1,不满足返回0
}
int main()
{
	int n; scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &arr[i]);
	}
	int x; scanf("%d", &x);
	int l = 1, r = n - 1;
	int result = -1;
	while (l < r)
	{
		int mid = (l + r)/2;
		if (check(mid, x)) 
		{
			if (arr[mid]==x)
			{
				result = mid;
				break;
			}
			r = mid;
		}
		else
		{
			r = mid - 1;
		}
	}
	printf("%d\n", result);
	return 0;
}

代码解释:

  1. 数组定义与 check 函数:首先定义了一个数组 arr 用于存储输入的有序数组元素。check 函数用于判断数组中索引为 mid 的元素是否大于等于要查找的 x,如果是则返回 1,否则返回 0
  2. 输入部分:在 main 函数中,先读取数组元素个数 n,然后通过循环依次读取数组的每个元素并存储在 arr 中。接着读取要查找的数 x
  3. 二分查找过程:初始化查找的左边界 l 为 1,右边界 r 为 n - 1。在 while 循环中,计算中间位置 mid。如果 check(mid, x) 为真,即 arr[mid] >= x,则进一步判断 arr[mid] 是否等于 x,如果相等则找到了目标元素,记录其位置并跳出循环;否则将右边界 r 更新为 mid。如果 check(mid, x) 为假,则将右边界 r 更新为 mid - 1
  4. 输出结果:循环结束后,result 存储了目标元素的位置(如果存在),或者 -1(如果不存在),最后将其输出。
  5. 自身建议: 在代码中合适地方利用函数进行查找的区间进行判定有利于大家后续的二分答案的书写,在后续我也会持续更新,希望一起共同进步学习。

三、总结

二分查找算法通过不断缩小查找范围,将查找时间复杂度降低到 O(logn),大大提高了查找效率。在实际应用中,只要数据是有序的,二分查找都能发挥重要作用。通过本题的代码实践,我们对二分查找的原理和实现有了更深入的理解,同时也认识到代码优化的重要性。希望本文能对大家在算法学习和实践中有所帮助。

<think>好的,我现在需要帮助用户查找东方OJ1966的题解或问题讨论。首先,用户提供了几个引用链接,我需要先查看这些引用是否包含相关信息。 查看引用1,是关于东方OJ答案1051-1100的客,但用户的问题是关于1966题,可能不在这个范围内。引用2是洛谷的安全逃离题解,可能与东方的题目无关。引用3是东方的1893、1821、1822题解,同样不涉及1966。 接下来,我应该考虑用户可能的需求。通常OJ题目的编号可能对应特定算法或问题类型。例如,1966可能涉及动态规划、贪心或数据结构等。根据引用3中的代码,用户之前可能接触过最长递增子序列(LIS)的问题,但不确定是否相关。 由于提供的引用中没有直接关于1966的信息,我需要推测可能的解题方向。可能1966题涉及类似的算法,比如动态规划或二分查找优化。建议用户检查题目描述,确认问题类型,或者提供更多细节以便更准确地定位解答。 同时,提醒用户参考官方资源或社区讨论,比如优快云客或其他编程论坛,可能有其他用户分享过题解。此外,可以建议用户搜索特定关键词,如“东方OJ 1966题解”来查找相关资料。 如果用户能提供题目的大致内容或输入输出样例,可以进一步缩小范围,给出更具体的建议。例如,如果是数学问题,可能需要不同的方法,如组合数学或数论;如果是字符串处理,可能需要考虑KMP或哈希等算法。 总结来说,由于信息有限,需要用户提供更多题目细节,或者自行搜索相关资源。同时,根据常见OJ题目的模式,推测可能的解题思路,帮助用户寻找方向。</think>根据现有参考资料分析,未找到与东方OJ1966直接相关的题解内容[^1][^3]。但根据OJ题目编号规律和常见算法类型,提供以下解题思路建议: ### 可能考察方向分析 1. **动态规划问题** 参考类似编号的东方题目(如引用3中的LIS问题),1966可能涉及: - 背包问题变种(完全背包/多维背包) - 路径规划问题(二维网格递推) - 状态压缩DP 2. **数学建模问题** 若题目涉及几何/数论,可能需要: ```math $$ \sum_{i=1}^n i^k \quad \text{或} \quad \gcd(a_1,a_2,...,a_n) $$ ``` 3. **图论算法** 若涉及节点关系,可能需要: - 最短路径算法(Dijkstra/Floyd) - 并查集应用 - 拓扑排序 ### 建议行动步骤 1. **确认题目描述** 通过OJ系统获取题目具体描述,特别注意输入输出样例 2. **搜索策略示例** ```python # 二分查找框架参考(若涉及搜索类问题) def binary_search(arr, target): l, r = 0, len(arr)-1 while l <= r: mid = (l+r)//2 if arr[mid] == target: return mid elif arr[mid] < target: l = mid + 1 else: r = mid - 1 return -1 ``` 3. **参考资源建议** 可尝试以下搜索关键词: - "东方1966 题解 site:csdn.net" - "OJ1966 动态规划/图论" - "编程训练平台 题目1966"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值