poj3977 Subset 中途相遇法

2021-06-16 22:36:20 字數 616 閱讀 3037

嗯wa了10次……一道難度不是很大但細節很要命的題

給定乙個有n個數的集合,求這個集合的乙個絕對值最小非空子集,有多解時子集的元素個數最小。

關鍵就是在於這個非空....

列舉出一邊的集合的時候,自然的要將相同子集和的子集只留下集合元素個數最小的乙個,除了子集和為0的以外,子集和為0的還要保留次小。

二分的時候要判斷很多很麻煩,所以把±3範圍內的所有情況都統計了一遍。

#include #include #include #include #include #include #include #include #include #include #define n 100005

typedef long long ll;

using namespace std;

int n , m , p;

ll a[40];

pairs[1 << 17] , t[1 << 18];

ll aabs(ll x)

maph;

void work()

} cout << ans << ' ' << sum << endl;

}int main()

poj3977 Subset(折半列舉)

給定n個整數組成的數列 n 35 從中選出乙個子集,使得這個子集的所有元素的值的和的絕對值最小,如果有多組資料滿足的話,選擇子集元素最少的那個。如果單純的列舉的話,這n個數分別有選和不選兩種,所以一共有2 35個子集。很明顯,會超時,但是我們可以將這個整數數列分成兩半,可得每邊最多18個,如果分別進...

POJ3977 Subset 折半列舉

題目大意是給定n個數的集合,從這個集合中找到乙個非空子集,使得該子集元素和的絕對值最小。假設有多個答案,輸出元素個數最少的那個。n最多為35,假設直接列舉顯然是不行的。可是假設我們將這些數分成兩半後再列舉的話,最多有2 18 262144 此時我們兩半列舉後的結果進行排序後再二分搜尋一下就能夠了。複...

POJ 3977 Subset 折半搜尋

題目 給出乙個整數集合,求出非空子集中元素和絕對值最小是多少 元素個數盡量少 題解 分成兩半 爆搜每一半,用map維護前一半的值 每搜出後一半的乙個值就去map裡找和他和絕對值最小的更新答案 include include include include includetypedef long lo...