poj 3977 折半列舉

2022-04-28 16:12:10 字數 1214 閱讀 3035

題目大意

給定n(n<=35)個數字,每個數字都<= 2^15. 其中乙個或多個數字加和可以得到s,求出s的絕對值的最小值,並給出當s取絕對值最小值時,需要加和的數字的個數。

題目分析

實現(c++)

#include#include#include#include#include#include#includeusing namespace std;

long long int ll_abs(long long int n)

long long int an[40];

mapsum_map;

int main2()

long long int min_sum = ll_abs(an[0]);

int min_count = 1;

int m = n / 2;

for (int i = 0; m > 0 && i < (1 << m); i++)

t >>= 1;

}if (count == 0)

continue;

if (sum_map.find(sum) != sum_map.end())

else

sum_map[sum] = count;

if (ll_abs(sum) < min_sum)

else if (ll_abs(sum) == min_sum)

} m = n / 2 + n % 2;

for (int i = 0; i < (1 << m); i++)

t >>= 1;

}if (count == 0)

continue;

if (ll_abs(sum) < min_sum)

else if (ll_abs(sum) == min_sum)

it = sum_map.lower_bound(-sum);

if (it != sum_map.end())

else if (ll_abs(s) == min_sum)

}if (it != sum_map.begin())

else if (ll_abs(s) == min_sum)

}} printf("%lld %d\n", min_sum, min_count);

} return 0;

}

POJ 3977 折半列舉

如無法區分折半列舉,二分,這裡 這題我感覺出了是用列舉,畢竟資料範圍很小,但是,集合中每個元素都有可能被選或者不被選,根據計數原理應該會有 2 1 種情況,需要刨除空集,列舉顯然是會t掉,那怎麼辦呢?考慮選出來的集合有幾種情況,有可能都在前一半,有可能都在後一半,還有可能前後都有,前後都有的情況可以...

POJ 3977 折半列舉

給你n個數,n最大35,讓你從中選幾個數,不能選0個,使它們和的絕對值最小,如果有一樣的,取個數最小的 子集個數共有2 n個,所以不能全部列舉,但是可以分為兩部分列舉 列舉一半的所有情況,然後後一半二分即可 1 include bits stdc h 2 define n 45 3using nam...

poj3977(折半列舉,多坑)

translation 給出一列數列,找出其中的非空連續子串行,使得其和的絕對值最小。如果有相同的和的情況下輸出元素個數最少的那個 solution 折半列舉即可 note 思路很簡單,分成兩半,折半列舉即可,但是 中有很多坑。首先必須對前後兩部分只選乙個的情況單獨考慮。然後如果 ans sum的預...