POJ3977(折半枚举)

来源:互联网 发布:acfunfix.js 编辑:程序博客网 时间:2024/05/02 02:38

 原来一直以为的map.lowerbound和upperbound是错的。。。

学习了make_pair

#include <iostream>#include <cstdio>#include <map>#include <cstring>#include <math.h>using namespace  std;typedef long long LL;const int maxn = 1000000+10;map <LL ,LL > M;int n;LL s[maxn];LL abs (LL x){    return x > 0? x:-x;}int main(){    while(scanf("%d",&n)!=EOF && n)    {        memset(s,0,sizeof(s));        M.clear();        for(int i=0 ;i<n;i++)        {            scanf("%lld",&s[i]);        }        pair<LL,LL> ans(abs(s[0]),1);        long long m = 1 << (n/2);        for(int i=1;i<m;i++)        {            LL sum = 0 ;            LL k = 0;            for(int j=0;j<(n/2);j++)            {                if(i & (1 << j))                {                    sum += s[j];                    k++;                }            }            ans = min(ans , make_pair(abs(sum),k));            if(M[sum]) M[sum] = min(M[sum],k);            else M[sum] = k;        }        for(int i=1;i<(1<<(n-n/2));i++)        {            LL sum =0 ;            LL k = 0;            for(int j=0;j<(n-n/2);j++)            {                if(i & (1<<j))                {                    k++;                    sum += s[j+n/2];                }            }            ans = min(ans , make_pair(abs(sum),k));            map<LL,LL> :: iterator it = M.lower_bound(-sum);            if(it != M.end())            {                ans = min(ans , make_pair(abs(it->first+sum),it->second+k));            }            if(it != M.begin())            {                it--;                ans = min(ans , make_pair(abs(it->first+sum),it->second+k));            }        }        cout << ans.first << " " << ans.second  << endl;    }    return 0;}

原创粉丝点击