Codeforces Round #306 (Div. 2) B. Preparing Olympiad (二进制枚举)

来源:互联网 发布:json怎么写注释 编辑:程序博客网 时间:2024/05/18 00:55

熊希了一下二进制枚举的方法:

1.  利用二进制的开关特性,用1表示元素在集合内,用0表示不在集合内。

2. 可以用 从1到1<<n 这些数字表示出所有子集。


例题  :

给出一个集合,求满足条件M的子集的个数。  (M:MAX-MIN>=s  &&  MIN>=l  && MAX<= r)

#include <bits/stdc++.h>using namespace std;#define cir(a,b) memset(a,b,sizeof a)#define long long  ll#define INF 1e9int n,l,r,x;int s[26];int main(){    while(~scanf("%d%d%d%d",&n,&l,&r,&x))    {        for(int i=0;i<n;i++)        {            scanf("%d",&s[i]);        }        int m = 1<<n;        int cnt = 0;        for(int i=0;i<m;i++)//可能出现的集合的个数        {            int Max = -1;            int Min = INF;            int s = 0;            for(int j=0;j<n;j++)            {                if(i&(1<<j))//检查元素是否在子集内                {                    s+=s[j];                    Max = Max > s[j]? Max : s[j];                    Min = Min < s[j]? Min : s[j];                }            }            if(s<=r&&s>=l&&Max-Min>=x)            {                cnt ++;            }        }        cout << cnt << endl;    }    return 0;}


1 0
原创粉丝点击