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_elementmin_element 函数来简化 max 和 min 函数的实现。
  • 可以使用 STL 中的 accumulate 函数来简化 sum 函数的实现。
  • 可以使用 STL 中的 vector 容器来存储同学的得分,避免使用固定大小的数组。

希望这篇文章能帮助您理解 C++ 歌唱比赛评分算法,并能够应用于实际的编程问题。

C++ 歌唱比赛评分算法:求最高得分

原文地址: https://www.cveoy.top/t/topic/oFkR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录