题目
给定N个整数组成的数列(N<=35),从中选出一个子集,使得这个子集的所有元素的值的和的绝对值最小,如果有多组数据满足的话,选择子集元素最少的那个
思路
看到与数列的和有关,思考一下可不可以尺取,发现不需要求连续数列,此时很难构造一个具有单调性的符合题意的数组供尺取法使用(欢迎有大佬指正)。在思考一下,好像也可以用二分搜索,把这个绝对值作为目标值,但是每个整数 1 0 15 10^{15} 1015,而且当 m i d mid mid不能作为最小绝对值,不代表 m i d − 1 mid-1 mid−1不行,比如 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