1 条题解
-
0
📝 题目大意
给定 个评委的打分,去掉最高的 个分数和最低的 个分数,求剩余 个分数的平均值。
💡 解题思路
- 题目分析: 最大为 ,因此 最多只有 个数据。 范围 ,数据量很小,直接排序后截取中间部分求和即可。
- 算法推导:
- 将所有 个分数存入数组
a,然后从小到大排序。 - 去掉最小的 个元素(索引 )和最大的 个元素(索引 )。
- 对中间 个元素(索引 )求和,记为
sum。 - 最终答案 =
sum / (3 * N)。
- 将所有 个分数存入数组
- 边界与细节:
- 输出要求误差不超过 ,使用
double类型并保留足够小数位(如 位)即可。 - 当 时,去掉 个最高和 个最低,剩余 个取平均。
- 若存在多个相同的最高/最低分,去掉其中任意 个不影响结果,因为剩下的 个元素集合是确定的。
- 输出要求误差不超过 ,使用
⏱️ 复杂度分析
- 时间复杂度:,其中 个元素排序。
- 空间复杂度:,存储 个分数。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; double sum = 0.0; vector<double> a(5 * n); // 存储 5N 个分数 for (int i = 0; i < 5 * n; i++) { cin >> a[i]; } sort(a.begin(), a.end()); // 从小到大排序 // 跳过最小的 N 个和最大的 N 个,取中间 3N 个求和 for (int i = n; i < 4 * n; i++) { sum += a[i]; } // 输出平均值,保留足够精度 cout << fixed << setprecision(12) << double(sum / (3 * n)) << '\n'; }
- 1
信息
- ID
- 683
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者