C++ 歌唱比赛评分算法:求最高得分
C++ 歌唱比赛评分算法:求最高得分
问题描述
n(n≤100) 名同学参加歌唱比赛,并接受 m(m≤20) 名评委的评分,评分范围是 0 到 10 分。这名同学的得分就是这些评委给分中去掉一个最高分,去掉一个最低分,剩下 m−2 个评分的平均数。请问得分最高的同学分数是多少?评分保留 2 位小数。
样例
输入样例: 7 6 4 7 2 6 10 7 0 5 0 10 3 10 2 6 8 4 3 6 6 3 6 7 5 8 5 9 3 3 8 1 5 9 9 3 2 0 5 8 0 4 1 10
输出样例: 6.00
思路
题目要求我们求出每个同学的得分,然后再求出最高得分。每个同学的得分都需要计算,因此我们需要设计一个函数来计算单个同学的得分,然后再用循环遍历所有同学,记录下最高得分。
计算单个同学的得分需要用到去掉一个最高分和最低分的平均数,因此我们需要先写一个函数来计算平均数。
代码实现
代码中的 average 函数用来计算平均数,实现时需要去掉一个最高分和一个最低分,因此需要先手写求最高分和最低分的函数 max 和 min。
然后,我们在主函数中,先用一个循环遍历所有同学,然后在循环中再写一个循环来读取所有的分数,最后调用 average 函数计算该同学的得分,并记录下来。最后再调用 maxDouble 函数找到得分最高的同学的得分,并输出。
C++ 代码
#include <iostream>
#include <iomanip>
using namespace std;
int sum(int nums[], int length) {
int s = 0;
for (int i = 0; i < length; i++) s += nums[i];
return s;
}
int max(int nums[], int length) {
int m = nums[0];
for (int i = 1; i < length; i++)
if (nums[i] > m)
m = nums[i];
return m;
}
double maxDouble(double nums[], int length) {
double m = nums[0];
for (int i = 1; i < length; i++)
if (nums[i] > m)
m = nums[i];
return m;
}
int min(int nums[], int length) {
int m = nums[0];
for (int i = 1; i < length; i++)
if (nums[i] < m)
m = nums[i];
return m;
}
double average(int nums[], int length) {
return (double(sum(nums, length)) - max(nums, length) - min(nums, length)) / (length - 2);
}
int main() {
int n, m;
cin >> n >> m;
double averages[n];
int nums[m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> nums[j];
}
averages[i] = average(nums, m);
}
printf("%.2f", maxDouble(averages, n));
return 0;
}
代码解释
- sum 函数:计算数组元素的总和。
- max 函数:查找数组中最大的元素。
- maxDouble 函数:查找数组中最大的元素(double 类型)。
- min 函数:查找数组中最小的元素。
- average 函数:计算数组元素的平均值,并去除最大值和最小值。
- 主函数:
- 读取输入的 n 和 m 值。
- 使用循环遍历所有同学,读取每个同学的 m 个评分。
- 调用 average 函数计算每个同学的得分。
- 使用循环找到所有同学中得分最高的同学的得分。
- 使用 printf 函数将得分最高的同学的得分输出,保留两位小数。
优化建议
- 可以使用 STL 中的
max_element和min_element函数来简化 max 和 min 函数的实现。 - 可以使用 STL 中的
accumulate函数来简化 sum 函数的实现。 - 可以使用 STL 中的
vector容器来存储同学的得分,避免使用固定大小的数组。
希望这篇文章能帮助您理解 C++ 歌唱比赛评分算法,并能够应用于实际的编程问题。
原文地址: https://www.cveoy.top/t/topic/oFkR 著作权归作者所有。请勿转载和采集!