1.练习项目 :
问题描述
肖恩需要在 n 道题中选出一套完整的比赛题集,每道题都有一个难度分数 ai 。主办方要求肖恩选的题目必须满足以下条件:
难度分数必须包含起码 3 种不同的值。
选出的题目中,最难的题和最简单的题难度分差不能小于 x 。
选出的题目难度分数的总和必须在 l,r 的范围内。
请计算有多少种可能的选题方式满足以上所有条件。
输入描述
第一行包括四个整数 n,l,r,x ,分别表示题目总数,难度和区间,最小难度差。
第二行包括 n 个整数,输入的第 i 个数字 ai 表示第 i 道题的难度。
数据保证 1≤n≤15,1≤l≤r≤109,1≤x≤106,1≤ai≤106。
输出描述
输出一个数字表示可能的方案数。
2.选择课程
在蓝桥云课中选择题库,选择题号3263并开始练习。
3.开始练习
(1)源码 :
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, l, r, x;
cin >> n >> l >> r >> x;
int *arr = (int *)malloc(sizeof(int) * (n + 3));
for (unsigned int i = 0; i < n; i++) {
cin >> arri;
}
int cnt = 0;
for (int i = 0; i < (int)pow(2, n); i++) { //共有2^n种情况,对应00...000~11...111
set<int>st;//使用一个集合排除分数相同的题目
int tmp = i; //暂存当前的二进制数i
int MAX = -1, MIN = 0x3fffff; //MAX用于记录所选题目中的最大值,MIN记录最小值
int sum = 0; //sum用于累加选择的题目的分数和
for (int j = 0; j < n; j++) { //对于二进制数的每一位
if (tmp & 1) { //当前位为1,则选择当前题目
sum = sum + arrj; //累加分数
st.insert(arrj);//插入集合中
if (arrj > MAX)MAX = arrj; //更新最大值
if (arrj < MIN)MIN = arrj; //更新最小值
}
tmp = tmp >> 1;
}
if (sum >= l && sum <= r && st.size() >= 3 && MAX - MIN >= x)cnt++; //符合要求,计数值加1
}
cout << cnt << endl; //输出计数值即可
return 0;
}
(2)检验结果
对此代码进行检验,检验后无报错,提交此代码,判题结果为正确100分。
(3)练习心得:
注意每段代码末尾的分号是否存在 ,如不存在则需即使补充;输入法是否切换为英语模式;语法是否错误。