用户输出
34
系统信息
Exited with return code 0
编号 | 题目 | 状态 | 分数 | 总时间 | 内存 | 代码 / 答案文件 | 提交者 | 提交时间 |
---|---|---|---|---|---|---|---|---|
#22884 | #1121. jwp的幸运集合(弱化版) | Accepted | 100 | 23 ms | 356 K | C++ / 995 B | 电类935-郑新宇 | 2020-02-15 11:31:42 |
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
int n, k, a[40], ans;
map<int, int> m1, m2;
// m1表示奇数个,m2表示偶数个
int main() {
cin >> n;
k = n >> 1;
for (int i = 0; i < n; i++) cin >> a[i];
int ma = 1 << k;
for (int i = 1; i < ma; i++) {
int sum = 0, cnt = 0;
//状态压缩
for (int j = 0; j < k; j++)
if ((i >> j) & 1)
cnt++, sum += a[j];
//右移j位若末位是1说明该选择中有a[j]
// a[]的下标要从0开始,右移0位就是自身,同理退后
if (cnt & 1)
m1[sum]++; //奇数个和为sum的数量加一
else {
m2[sum]++; //偶数个和为sum的数量加一
if (!sum)
ans++; //符合题意的
}
}
ma = 1 << (n - k);
for (int i = 1; i < ma; i++) {
int sum = 0, cnt = 0;
for (int j = 0; j < n - k; j++)
if ((i >> j) & 1)
cnt++, sum += a[j + k];
if (cnt & 1)
ans = ans + m1[-sum]; //两个奇数个集合,-sum保证和为0
else {
ans = ans + m2[-sum];
if (!sum)
ans++;
}
}
cout << ans;
return 0;
}
用户输出
34
系统信息
Exited with return code 0
用户输出
69
系统信息
Exited with return code 0
20
50000000 -50000000 50000000 -50000000 50000000 -50000000 50000000 -50000000 50000000 -50000000 50
<93 bytes omitted>
用户输出
184755
系统信息
Exited with return code 0
20
50000000 50000000 50000000 50000000 50000000 50000000 50000000 50000000 50000000 50000000 5000000
<82 bytes omitted>
用户输出
0
系统信息
Exited with return code 0
用户输出
255
系统信息
Exited with return code 0