zoukankan      html  css  js  c++  java
  • AT3857[AGC020C]Median Sum【背包,bitset】

    正题

    题目链接:https://www.luogu.com.cn/problem/AT3857


    题目大意

    给出\(n\)个数字的一个序列\(a\),求它的所有非空子集的和的中位数。

    \(1\leq n,a_i\leq 2000\)


    解题思路

    考虑到假设所有数的和为\(S\),一个集合的和为\(x\),那么肯定有与其对应的另一个集合和为\(S-x\)

    所以如果算空集的话中位数一定是\(\frac{S}{2}\),但是因为不算所以需要往后移一个,那就是和大于且最接近\(\frac{S}{2}\)的一个集合。

    考虑怎么求这个和,暴力背包显然会\(T\),但是因为我们只需要求能不能拼出这个数,所以直接用\(bitset\)就好了。

    时间复杂度:\(O(\frac{n^2a_i}{\omega})\)


    code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<bitset>
    using namespace std;
    const int N=2010;
    int n,sum,a[N];
    bitset<N*N/2> f;
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++){
    		scanf("%d",&a[i]);
    		sum+=a[i];
    	}
    	int k=0;sum=(sum+1)/2;
    	f[0]=1;
    	for(int i=1;i<=n;i++)
    		f=f|(f<<a[i]);
    	while(!f[sum])sum++;
    	printf("%d\n",sum);
    	return 0;
    }
    
  • 相关阅读:
    jmeter取样器
    【递归】普通递归关系
    7月,开始奋斗吧!
    BZOJ 1503 郁闷的出纳员
    bzoj 3262: 陌上花开
    BZOJ 2286 消耗战
    莫队
    bzoj1483: [HNOI2009]梦幻布丁
    字符串算法模板
    高级数据结构模板
  • 原文地址:https://www.cnblogs.com/QuantAsk/p/15469039.html
Copyright © 2011-2022 走看看