你有n个问题。你已经把第i个题的难度估计为整数ci。现在你要准备一份比赛的习题集,使用你做过的一些问题。竞赛的习题集必须至少包含两个问题。你认为比赛问题的总难度至少是l,最多是r。而且,你认为所选问题中最简单和最难的难度之差至少是x。 找出为比赛选择问题集的方法的数量。第一行包含4个整数n, l, r, x(1≤n≤15,1≤l≤r≤109,1≤x≤106)-你的问题数,问题集总难度的最小值和最大值,以及包中最难的问题与最简单的问题之间的最小难度差。第二行包含n个整数c1, c2,…, cn(1≤ci≤106)-每道题的难度。打印出为比赛选择合适问题集的方法的数量的具体代码
时间: 2023-02-07 21:53:07 浏览: 92
我们可以使用暴力枚举的方法来解决这个问题。对于每一个问题集,我们可以枚举它是否包含每一个问题,然后检查这个问题集是否符合条件。如果符合条件,我们就将答案加一。
这里是具体的代码:
```
int n, l, r, x;
cin >> n >> l >> r >> x;
// 读入难度
vector<int> c(n);
for (int i = 0; i < n; i++) {
cin >> c[i];
}
// 枚举每一个问题集
int ans = 0;
for (int i = 0; i < (1 << n); i++) {
// 计算难度的和
int sum = 0;
int min_diff = 1000000;
int max_diff = -1;
for (int j = 0; j < n; j++) {
if (i & (1 << j)) {
sum += c[j];
min_diff = min(min_diff, c[j]);
max_diff = max(max_diff, c[j]);
}
}
// 判断是否符合条件
if (sum >= l && sum <= r && max_diff - min_diff >= x) {
ans++;
}
}
cout << ans << endl;
```
阅读全文