原来一直以为的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;
}