POJ2785 (折半枚举)

该博客介绍了一个POJ2785的编程题目,要求找到四组数字中和为0的组合。博主提出使用优化的二分查找方法来解决复杂的数据问题。文章详细解释了如何将问题拆半并利用二分查找技术,同时阐述了STL中的`upper_bound()`和`lower_bound()`函数的工作原理和应用场景,帮助理解这两个函数在二分查找中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给出四组数字,各拿出一个相加之和为0,求出有几种方法。

思路:

相对来说还是很好想通,问题数据很复杂, 为了快速的查找,肯定要用优化,
关键是如何与查找联系,这里给出折半的方法,把问题分成两半解决,先枚举
出一半的情况,再二分查找。

不过还是要说明一下STL中的两个函数

  1. 函数upper_bound()返回的在前闭后开区间查找的关键字的上界,如一个数组number序列1,2,2,4.upper_bound(2)后,返回的位置是3(下标)也就是4所在的位置,同样,如果插入元素大于数组中全部元素,返回的是last。
  2. 函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置
    举例如下:
    一个数组number序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,111.pos为要插入的位置的下标则pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number数组的下标为0的位置。
    pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number数组的下标为1的位置(即10所在的位置)。
    pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素)。
    所以,要记住:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值