B. Preparing Olympiad
题目大意:在一些数里面选择至少两个数,它们的和>l并且<r,并且他们最大值最小值的差至少大于x。
思路:枚举全部的情况,共有2的n次方-1种,如何确定选择的是哪个情况呢,运用与运算即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll nl=1e5+5;
ll a[nl];
int main(){
ll n,l,r,x;
cin>>n>>l>>r>>x;
ll i,j;
for(i=0;i<n;i++){
cin>>a[i];
}
ll s;
s=1<<n;//所有情况数+1
ll sum=0;
ll maxn=1000000;
ll minn=-1;
ll cnt=0;
for(i=1;i<s;i++){
sum=0;
maxn=1000000;
minn=-1;
for(j=0;j<n;j++){
if(1<<j&i){//这个东西可以确定是哪个情况(选择那些数)证明:取一个例子 第一个样例即可,将数化为二进制,看着代码一步一步计算(对比两层循环里面的代码即可)
sum+=a[j];
maxn=min(maxn,a[j]);
minn=max(minn,a[j]);
}
}
if(sum>=l&&sum<=r&&minn-maxn>=x){
cnt++;
}
}
cout<<cnt<<endl;
}