C++课后习题训练记录Day179

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)练习心得:

注意每段代码末尾的分号是否存在 ,如不存在则需即使补充;输入法是否切换为英语模式;语法是否错误。

相关推荐
hansang_IR1 小时前
【题解】[COCI 2024/2025 #2] 流明 / Blistavost
c++·算法·动态规划·dp
不正经学生1 小时前
C语言指针进阶:const 和野指针——给指针加锁,向野指针宣战
c语言·开发语言·c++·算法·c#
程序喵大人1 小时前
【C++进阶】STL算法与函数对象 - 01 让算法去处理一段迭代器范围
开发语言·c++·算法·函数对象
cui_ruicheng2 小时前
Python数据分析(十三):Seaborn 统计可视化
开发语言·python·信息可视化·数据分析
大尚来也2 小时前
HTML5 Web Worker:彻底解决JS阻塞页面卡顿问题
开发语言
sycmancia3 小时前
Qt——复习篇painter
开发语言·qt
旖旎夜光3 小时前
LeetCode 738:单调递增的数字(贪心算法) —— 题解
数据结构·c++·算法·leetcode·贪心算法
赵钰老师3 小时前
R语言数据统计分析与ggplot2高级绘图
开发语言·数据分析·r语言