POJ 3977 Subset 簡單折半列舉

2021-08-18 11:51:54 字數 507 閱讀 1059

題意:n個數選若干個,使他們和的絕對值最小,如果存在多個解,選擇所選的個數最少的。

題解:n為35,列舉所有情況肯定超時,可以列舉一半然後二分找另一半。

#include #include #include #include #include #include using namespace std;

typedef long long ll;

mapm;

ll a[50];

ll abs(ll x)

int main()

else

} for(int i=0;i::iterator it=m.lower_bound(-sum);

if(it!=m.end())

if(it!=m.begin())

}printf("%lld %lld\n",ans.first,ans.second);

} return 0;

}

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...