1 条题解
-
1
问题分析
这个问题的核心是逐关计算前缀平均值(向下取整),并判断当前关卡难度是否超过该平均值。关键要点:
- 第1个关卡前面无关卡,平均值视为0,必然符合条件;
- 从第2关开始,每一关需要计算前面所有关卡的总和、数量,再求平均值(向下取整);
- 遍历过程中累计符合条件的关卡数量即可。
完整C++代码实现
#include <iostream> #include <vector> using namespace std; int main() { int n; // 读取关卡数量 cin >> n; vector<int> levels(n); // 读取每个关卡的难度值 for (int i = 0; i < n; ++i) { cin >> levels[i]; } int count = 0; // 记录符合条件的关卡数 int sum = 0; // 前缀和(前面所有关卡的难度总和) // 遍历每个关卡 for (int i = 0; i < n; ++i) { int current_level = levels[i]; int avg; // 前面所有关卡的平均难度(向下取整) if (i == 0) { // 第1个关卡,前面无关卡,平均值为0 avg = 0; } else { // 计算前面i个关卡的平均值(向下取整,整数除法自动实现) avg = sum / i; } // 判断当前关卡难度是否超过平均值 if (current_level > avg) { count++; } // 更新前缀和(将当前关卡加入,供下一关计算) sum += current_level; } // 输出结果 cout << count << endl; return 0; }代码详细解释
-
输入处理:
- 读取关卡数量
n,并用vector<int>存储每个关卡的难度值; - 选择
vector是因为其易用性,也可以用普通数组(如int levels[1001])。
- 读取关卡数量
-
核心变量:
count:统计符合条件的关卡数,初始为0;sum:记录“前面所有关卡”的难度总和,初始为0(遍历中动态更新)。
-
遍历逻辑(逐关判断):
- 第1关(i=0):
- 前面无关卡,平均值
avg设为0; - 由于关卡难度≥1,必然满足
current_level > 0,count加1; - 更新
sum为当前关卡难度。
- 前面无关卡,平均值
- 后续关卡(i≥1):
- 计算前面
i个关卡的平均值:sum / i(C++中整数除法会自动向下取整,无需额外处理); - 若当前关卡难度>平均值,
count加1; - 更新
sum(加上当前关卡难度,供下一关计算)。
- 计算前面
- 第1关(i=0):
-
输出结果:遍历结束后,输出统计的
count值。
测试用例验证(样例1)
输入:
5 3 1 4 2 5执行过程: | 关卡i | 当前难度 | 前面总和sum | 前面数量 | 平均值avg | 是否>avg | count | sum更新后 | |-------|----------|-------------|----------|-----------|----------|-------|-----------| | 0 | 3 | 0 | 0 | 0 | 是 | 1 | 3 | | 1 | 1 | 3 | 1 | 3 | 否 | 1 | 4 | | 2 | 4 | 4 | 2 | 2 | 是 | 2 | 8 | | 3 | 2 | 8 | 3 | 2 | 否 | 2 | 10 | | 4 | 5 | 10 | 4 | 2 | 是 | 3 | 15 |
最终输出
3,与样例一致。边界情况测试
- n=1:输入
1 5→ 输出1(唯一关卡符合条件); - 所有关卡难度相同:输入
3 2 2 2→ 第1关符合(2>0),第2关(2>2?否),第3关(2>2?否)→ 输出1; - 严格递增序列:输入
4 1 2 3 4→ 第1关(1>0)、第2关(2>1)、第3关(3>1)、第4关(4>2)→ 输出4。
总结
- 核心逻辑:通过前缀和动态计算前面所有关卡的平均值,逐关判断是否满足条件;
- 关键细节:第1关平均值为0,整数除法自动实现“向下取整”;
- 时间复杂度:O(n)(仅一次遍历),空间复杂度O(n)(存储关卡难度),完全满足n≤1000的限制。
- 1
信息
- ID
- 613
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 62
- 已通过
- 9
- 上传者