Poj:3977-Subset:清晰题解,最小化子集之和的绝对值,折半枚举

题目

给定N个整数组成的数列(N<=35),从中选出一个子集,使得这个子集的所有元素的值的和的绝对值最小,如果有多组数据满足的话,选择子集元素最少的那个

思路

看到与数列的和有关,思考一下可不可以尺取,发现不需要求连续数列,此时很难构造一个具有单调性的符合题意的数组供尺取法使用(欢迎有大佬指正)。在思考一下,好像也可以用二分搜索,把这个绝对值作为目标值,但是每个整数 1 0 15 10^{15} 1015,而且当 m i d mid mid不能作为最小绝对值,不代表 m i d − 1 mid-1 mid1不行,比如 20 , − 100 , 100 20,-100,100 20,100,100 10 10 10不能作为最小绝对值,但是 0 0 0却可以,解决方法是每次判断 x x x能否作为最小绝对值时使用小于的关系,即是否存在一个序列值和的绝对值小于 x x x,However,这样做好像又多此一举了,如果能找到一个序列值的绝对值之和小于 x x x,那么我为啥不直接找到绝对值之和最小的序列呢?所以二分法分的有些鸡肋,一遍其实就可以求解。

当然 2 35 2^{35} 235也不能直接枚举,卡的死死的,和枚举有关的问题,由于数据范围太大不能求解的,都可以考虑一下折半枚举。对每一个输入的 n n n,我们将数组 a [ n ] a[n] a[n],拆分成两个部分 [ 1 , n 2 ) , [ n 2 , n ) [1,\frac{n}{2}),[\frac{n}{2},n) [1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值