AT3857 [AGC020C] Median Sum

https://www.luogu.com.cn/problem/AT3857

首先发现假设和为 s s s
如果存在和为 x x x的子集,那么一定存在和为 s − x s-x sx的子集
那么肯定是对称的
所以中位数一定是 ( s + 1 ) / 2 (s+1)/2 (s+1)/2往上找
那么只需要用 b i t s e t bitset bitset跑一遍背包看看每个数是否能被取到
第一个 > = ( s + 1 ) / 2 >=(s+1)/2 >=(s+1)/2的能被取到的数就是答案

code:

#include<bits/stdc++.h>
#define N 4000050
using namespace std;
int n;
bitset<N> f;
int main() {
    scanf("%d", &n);
    f[0] = 1; int s = 0;
    for(int i = 1; i <= n; i ++) {
        int x;
        scanf("%d", &x);
        f |= f << x; s += x;
    }
    for(int i = (s + 1) / 2; i <= s; i ++) if(f[i]) {printf("%d", i); return 0;}
    return 0;
}
posted @ 2021-10-12 07:33  lahlah  阅读(28)  评论(0编辑  收藏  举报