題意: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...