【NOIP2016提高A组集训第4场11.1】平衡的子集

题目

夏令营有N个人,每个人的力气为M(i)。请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法?

分析

如果暴力枚举每个人被分到哪个组或不分,O(2^20)显然会超时。
我们换一种思路,
每次只枚举一半,
将前后半部分分开枚举后半部分,枚举出每种的和以及有没有被选的状态。
枚举和相同的前后部分,如果这种状态没有被选过,就ans+1,然后将这种状态打个标记,这种状态就不再产生贡献。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const long long N=100000;
using namespace std;
struct ddx
{
    long long sum;
    int sta;
}a[N*6],b[N*6];
int re[N],n,ans,tot,tot1,bz[N*20],mi[N];
bool cmp(ddx x,ddx y)
{
    return x.sum<y.sum;
}
void dg(int x,long long y,int z)
{
    if(x>n/2)
    {
        a[++tot].sum=y;
        a[tot].sta=z;
        return;
    }
    dg(x+1,y,z);
    dg(x+1,y+re[x],z+mi[x-1]);
    dg(x+1,y-re[x],z+mi[x-1]);
}
void dg1(int x,long long y,int z)
{
    if(x>n)
    {
        b[++tot1].sum=y;
        b[tot1].sta=z;
        return;
    }
    dg1(x+1,y,z);
    dg1(x+1,y+re[x],z+mi[x-1]);
    dg1(x+1,y-re[x],z+mi[x-1]);
}
int main()
{
    scanf("%d",&n);
    mi[0]=1;
    for(int i=1;i<=n+1;i++) mi[i]=mi[i-1]*2;
    for(int i=1;i<=n;i++) scanf("%d",&re[i]);
    dg(1,0,0);
    dg1(n/2+1,0,0);
    sort(a+1,a+1+tot,cmp);
    sort(b+1,b+1+tot1,cmp);
    int i=1,j=1;
    for(;i<=tot && j<=tot1;)
    {
        if(a[i].sum<b[j].sum) i++;
        else
        if(a[i].sum>b[j].sum) j++;
        else
        {
        int k=i,l=j;
        for(;a[i].sum==a[k].sum;) k++;
        for(;b[j].sum==b[l].sum;) l++;
        for(int p=i;p<=k-1;p++)
            for(int q=j;q<=l-1;q++)
            {
                if(!bz[a[p].sta+b[q].sta])
                {
                    ans++;
                    bz[a[p].sta+b[q].sta]=true;
                }
            }
        i=k;
        j=l;
        }
    }
    cout<<ans-1;
}

原文地址:https://www.cnblogs.com/chen1352/p/9066602.html

时间: 2024-11-14 11:32:51

【NOIP2016提高A组集训第4场11.1】平衡的子集的相关文章

【NOIP2016提高A组集训第3场10.31】高维宇宙

题解 分析 因为只有奇数和偶数配对才有可能得出质数, 暴力求出每一对\(a_i+a_j\)为质数,将其中的奇数想偶数连一条边. 二分图匹配,匈牙利算法. #include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> const

【NOIP2016提高A组模拟9.9】运输妹子

题目 小轩轩是一位非同一般的的大农(lao)场(si)主(ji),他有一大片非同一般的农田,并且坐落在一条公路旁(可以认为是数轴),在他的农田里种的东西也非同一般--不是什么水稻小麦,而是妹子. 在小轩轩的细心培育下,他的大片农田都要结出妹子啦!但是他的农田分布实在是太广阔了,他担心自己的妹子会令路过的人想入非非,于是他想要把所有农田上的妹子都集中到一个仓库里面,贮存起来.可是妹子太多,他叫来了一辆卡车,这辆卡车刚好可以装满一个农田的妹子,并且在满载的情况下,运满满一卡车妹子走1米的费用是1元.

【NOIP2016提高A组模拟8.15】Password

题目 分析 首先我们知道,原A序列其实表示一个矩阵,而这个矩阵的对角线上的数字就是答案B序列. 接着\(a.b>=gcd(a,b)\),所以序列A中的最大的数就是ans[1],第二大的数就是ans[2]. 但是ans[3]并不一定就是序列A中的第三大的数,因为gcd(ans[1],ans[2])有可能是序列A中的第三大的数. 所以但找到了ans[i],对于每个gcd(ans[i],ans[1~i-1])在序列A中删掉两个(就是删掉2(i-1)个.为什么是两个自己考虑).时间复杂度\(O(n^2l

【NOIP2016提高A组8.11】自然数

题目 分析 \(O(n)\)求出mex(1,i)(1<=i<=n): 虽然0<=ai<=10^9,但只有n个数,所以mex一定小于等于n for(long long j=1;j<=n;j++) { if(a[j]<=n) bz[a[j]]=false; for(long long k=top;k<=n;k++) { if(bz[k]) { top=k; ans+=top; break; } } } 显然mex是单调不下降的, 接着用线段树维护mex. 如果删掉a[

【NOIP2016提高A组模拟8.14】传送带

题目 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.FTD在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在FTD想从A点走到D点,他想知道最少需要走多长时间 分析 易得,答案就是首先在AB上走一段,然后走到CD上的一点,再走到D. 正解就是三分套三分,但本人很懒,打了个枚举加三分,勉强卡了过去. 首先在AB上枚举一点,接着在CD上按时间三分. #include <cmath> #include <iostrea

【NOIP2016提高A组8.12】通讯

题目 "这一切都是命运石之门的选择." 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部必须尽快将这个消息通过地下秘密通讯网络,传达到所有分部. SERN共有N个部门(总部编号为0),通讯网络有M条单向通讯线路,每条线路有一个固定的通讯花费Ci. 为了保密,消息的传递只能按照固定的方式进行:从一个已知消息的部门向另一个与它有线路的部门传递(可能存在多条通信线路).我们定义总费用为所

【NOIP2016提高A组8.12】奇袭

题目 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试--魔界入侵. 唯一一个神一般存在的Administrator被消灭了,靠原本的整合骑士的力量是远远不够的.所以爱丽丝动员了UW全体人民,与整合骑士一起抗击魔族. 在UW的驻地可以隐约看见魔族军队的大本营.整合骑士们打算在魔族入侵前发动一次奇袭,袭击魔族大本营! 为了降低风险,爱丽丝找到了你,一名优秀斥候,希望你能在奇袭前对魔族大本营进行侦查,并计算出袭击的难度. 经过侦查,你绘制出了魔族大

【NOIP2016提高A组8.12】总结

惨败!!!! 第一题是一道神奇的期望问题. 第二题,发现"如果两个部门可以直接或间接地相互传递消息(即能按照上述方法将信息由X传递到Y,同时能由Y传递到X),我们就可以忽略它们之间的花费"这个条件,就想到要用tarjan缩点,不过打完tarjan之和就没有思路了,爆零.后来才知道只用比较大小就OK了. 第三题,没有思路只打了个暴力,30分. 接着强烈谴责出题人 怎么可以那么马虎. 原文地址:https://www.cnblogs.com/chen1352/p/9043468.html

【NOIP2016提高A组8.12】礼物

题目 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物. 商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜悦值不能重复获得). 每次,店员会按照一定的概率Pi(或者不拿出礼物),将第i种礼物拿出来.季堂每次都会将店员拿出来的礼物买下来. 众所周知,白毛切开都是黑的.所以季堂希望最后夏川的喜悦值尽可能地高. 求夏川最后最大的喜悦值是多少,并求出使夏川得到这个喜悦值,季堂的期望购买次数. 分析 首先,因为Wi>0,显然最大喜悦值为全选的情况. 注意