二进制暴力

来源:互联网 发布:js或 编辑:程序博客网 时间:2024/05/16 04:53

CF:550B

题意:输入n,l,r,x,再输入n个数,在这n个数中任意选其中某些数相加和为sum,要求sum>=l&&sum<=r,而且这组数中最大值与最小值之差>=x

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<queue>
#include<math.h>
using namespace std;
#define inff 1000000000
int main()
{
    int c,n,l,r,x,i,maxn,minn,sum,ans;
    int a[16];
    while(cin>>n>>l>>r>>x)
    {
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        ans=0;
        for(c=1;c<=(1<<n);c++)
        {
            maxn=0;minn=inff;
            sum=0;
            for(i=0;i<n;i++)
            {
                if((c>>i)&1)
                {
                   maxn=max(maxn,a[i+1]);
                   minn=min(minn,a[i+1]);
                   sum+=a[i+1];
                }
            }
            if(maxn-minn>=x&&sum>=l&&sum<=r)
            {
                ans++;
            }
        }
        cout<<ans<<endl;


    }
    return 0;
}


0 0
原创粉丝点击